有关数据包和缓冲区大小的TCP套接字编程

韦斯·潘

我知道TCP中没有数据包概念,因为它是一个流套接字,例如,如果我有一个2000字节的数据包,例如2000'a',而我的默认缓冲区大小是1024,则应该发送两次,两次收到?

因此对于send()函数,

iResult = send(s, sendbuf, packet_size, 0);

对于第二个参数,我应该输入什么?发送缓冲区字符指针(分配了1024个字节)还是数据包字符指针(分配了2000个字节),它将自动为我处理?

对于recv()阻塞函数,我应该将缓冲字符指针指向第二个参数还是数据包一个?

对于标题,我的朋友建议我添加4个字节的标题以存储数据包信息,例如。数据包的序列号和大小,如何实现?谢谢

@乔吉,谢谢!我也想问一下,如果我不执行部分写操作,而while循环中的发送速率非常快(无睡眠),那么服务器端会出现错误/丢失吗?对于recv()

SOCKET newsfd;
bind(s, (struct sockaddr *)ReceiverSocket, sizeof(struct sockaddr_in));
if (strcmp(protocol, "tcp") == 0 || strcmp(protocol, "TCP") == 0){
    listen(s, 1);
    newsfd = accept(s, 0, 0);
}

//*** Create Update Display Thread
std::thread th(Function_packet_transmission_display, update_interval, (char*) "recv");

//*** Receive Data//*** Set Jitter
long time_old = 0, time_new = 0, time_start = 0;
long float jitter_new = 0, jitter_old = 0;
long long temp_accubyte = 0, temp_pktnum = 0; //testing
char *recvbuf = new char[buffer_size];
long long next_seq_num = 1; int retVal;
do{

    if (strcmp(protocol, "tcp") == 0 || strcmp(protocol, "TCP") == 0){
        retVal = recv(newsfd, recvbuf, packet_size, 0);
        if ((retVal == SOCKET_ERROR) || (retVal == 0)){
            printf("\nreturn fail code:%i\n", WSAGetLastError());
            closesocket(s);
            WSACleanup();
            lck.lock();
            Ended = true;
            lck.unlock();
            return 0;
        }
    }
    else if (strcmp(protocol, "udp") == 0 || strcmp(protocol, "UDP") == 0){
        int fromlen = (int)sizeof(struct sockaddr_in);
        retVal = recvfrom(s, recvbuf, packet_size, 0, (struct sockaddr *)ReceiverSocket, &fromlen);
    }
    //testing
    temp_accubyte += retVal;
    temp_pktnum++;//TEST
    //printf("\racc: %lld %lld    -   ", temp_accubyte, temp_pktnum);
    //if (temp_pktnum==100000)            printf("\nReach 100000\n", temp_accubyte, temp_pktnum);

    if (timer == NULL){
        timer = new ES_FlashTimer();
    }
用户名

如果我有一个2000字节的数据包,说2000'a',

你不知道 您有一条2000字节消息

我的默认缓冲区大小是1024

不太可能。至少是8192,可能是数千K。

然后应该发送两次

至少。

并收到两次?

至少。

对于第二个参数,我应该输入什么?

您要发送消息的大小:在这种情况下,为2000。

发送缓冲区字符指针并分配了1024个字节

不。

还是一个2000字节的包字符指针,它将自动为我处理?

是的。

对于recv()阻塞函数,我应该将缓冲字符指针指向第二个参数还是数据包一个?

我无法说清楚这一点,但您应该将其尽可能多地放入缓冲区并循环,直到获得完整的消息为止。

对于标题,我的朋友建议我添加4个字节的标题以存储数据包信息,例如。包的序号和大小,如何实现!

您实际上并不需要序列号,但是消息大小是个好主意。只需将其粘贴在消息的前面即可。不清楚这里的问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在套接字编程中从缓冲区接收数据

来自分类Dev

有关C中文件流和缓冲区的问题

来自分类Dev

Linux套接字,如何获取发送缓冲区中的字节数/数据包数?

来自分类Dev

复制套接字缓冲区时,使用ctypes的Python数据包嗅探器崩溃

来自分类Dev

套接字和缓冲区的含义相同吗?

来自分类Dev

TCP套接字缓冲区大小也应该是连接的MSS的偶数倍

来自分类Dev

可变大小的缓冲区,用于接收UDP数据包

来自分类Dev

用户缓冲区大小以接收多播数据包?

来自分类Dev

如何获取丢失的Udp缓冲区大小超出的数据包

来自分类Dev

每个流的TCP套接字缓冲区

来自分类Dev

套接字缓冲区大小:较大与较小的优缺点

来自分类Dev

在Windows下更改默认套接字缓冲区大小

来自分类Dev

套接字缓冲区大小未增加

来自分类Dev

TcpWindowSize与Windows上的套接字缓冲区大小

来自分类Dev

从套接字读取而不知道缓冲区的大小

来自分类Dev

如何获得底层套接字读取缓冲区的大小?

来自分类Dev

Windows上的TcpWindowSize vs套接字缓冲区大小

来自分类Dev

通过套接字发送文件 - 缓冲区大小

来自分类Dev

套接字服务器以缓冲区大小接收数据

来自分类Dev

在C ++中创建缓冲区/数据包

来自分类Dev

排序具有特定结构的数据包缓冲区

来自分类Dev

C#.NET套接字tcp begin / endreceive客户端:endreceive读取所有字节,但是在beginreceive中,缓冲区大小自行更改

来自分类Dev

将数据放回套接字缓冲区

来自分类Dev

获取有关数据响应的TCP套接字特定数据

来自分类Dev

具有神秘缓冲区的套接字

来自分类Dev

带有神秘缓冲区的套接字

来自分类Dev

套接字编程新手,有关“ select()”的问题

来自分类Dev

原始套接字中的TCP数据包-Centos 6.6

来自分类Dev

套接字 TCP 通信数据包拆分

Related 相关文章

  1. 1

    在套接字编程中从缓冲区接收数据

  2. 2

    有关C中文件流和缓冲区的问题

  3. 3

    Linux套接字,如何获取发送缓冲区中的字节数/数据包数?

  4. 4

    复制套接字缓冲区时,使用ctypes的Python数据包嗅探器崩溃

  5. 5

    套接字和缓冲区的含义相同吗?

  6. 6

    TCP套接字缓冲区大小也应该是连接的MSS的偶数倍

  7. 7

    可变大小的缓冲区,用于接收UDP数据包

  8. 8

    用户缓冲区大小以接收多播数据包?

  9. 9

    如何获取丢失的Udp缓冲区大小超出的数据包

  10. 10

    每个流的TCP套接字缓冲区

  11. 11

    套接字缓冲区大小:较大与较小的优缺点

  12. 12

    在Windows下更改默认套接字缓冲区大小

  13. 13

    套接字缓冲区大小未增加

  14. 14

    TcpWindowSize与Windows上的套接字缓冲区大小

  15. 15

    从套接字读取而不知道缓冲区的大小

  16. 16

    如何获得底层套接字读取缓冲区的大小?

  17. 17

    Windows上的TcpWindowSize vs套接字缓冲区大小

  18. 18

    通过套接字发送文件 - 缓冲区大小

  19. 19

    套接字服务器以缓冲区大小接收数据

  20. 20

    在C ++中创建缓冲区/数据包

  21. 21

    排序具有特定结构的数据包缓冲区

  22. 22

    C#.NET套接字tcp begin / endreceive客户端:endreceive读取所有字节,但是在beginreceive中,缓冲区大小自行更改

  23. 23

    将数据放回套接字缓冲区

  24. 24

    获取有关数据响应的TCP套接字特定数据

  25. 25

    具有神秘缓冲区的套接字

  26. 26

    带有神秘缓冲区的套接字

  27. 27

    套接字编程新手,有关“ select()”的问题

  28. 28

    原始套接字中的TCP数据包-Centos 6.6

  29. 29

    套接字 TCP 通信数据包拆分

热门标签

归档