发送端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数据才停下来?

https://www.cnblogs.com/lisuyun/articles/5803352.html