Sunsy 2019-12-19 18:59 采纳率: 0%
浏览 409
已结题

发送端TCP的发送缓存设置为10K, 接收端接收缓存设置为10K,接收端一直不调用RECV去接收,那么发送端到底能发送出多少数据?

  1. 编写TCP server和Client程序
  2. server端在accept之前调用setsockopt(slisten, SOL_SOCKET, SO_RCVBUF,(char*)&uiRcvBuf, uiRcvBufLen);将接收缓存设置为10K.
  3. cleint端在bind之前调用setsockopt(slisten, SOL_SOCKET, SO_SNDBUF,(char*)&uiSendBuf, uiSendBufLen);将发送缓存设置为10K
  4. cleint端调用send函数发送,相关代码如下:
   int n = 50;
    char sendData[1024];
    int len = sizeof(sendData);
    printf("sendlen = %u",len);
    for (int i = 0;i < len; i++)
    {
        sendData[i] = 0x01;
    }

   while (n) 
    {
        int iResult = send(sclient, sendData, len, 0 );
        if (iResult == SOCKET_ERROR) {
            printf("send failed with error: %d\n", WSAGetLastError());
            getchar();
            closesocket(sclient);
            WSACleanup();
            return 1;
        }

        n--;
        printf("Bytes Sent: %d,%d\n", iResult,50-n);
    }
  1. server端不调用recv函数接收
  2. wireshark抓包显示如下:
    图片说明

  3. cleint测试端发送了30k数据后停住了(send是阻塞式)

疑问:
1. wireshark图中为什么在第一个红色框图的时候win才开始变化(win从10240变成7736)?这之前的数据是存在哪里的?不是接收缓存?不应该从接收第一个包开始就开始减少吗?
2. wireshark图中第一个红色框图为什么会有大于20k的数据(ack=21049)?
3. 为什么从wireshark看到server接收了20k多的数据,而不是10k?
4. cleint端为什么能够send出30k数据才停下来?

  • 写回答

1条回答 默认 最新

  • dabocaiqq 2019-12-20 09:11
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 怎么获取下面的: glove_word2id.json和 glove_numpy.npy 这两个文件
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler
  • ¥15 oracle集群安装出bug