代码之家  ›  专栏  ›  技术社区  ›  Sonny

在C中设置TCP接收窗口并在Linux中使用tcpdump

  •  10
  • Sonny  · 技术社区  · 15 年前

    rwnd = 1024;
    setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (char *)&rwnd, sizeof(rwnd));
    

    上面的代码段位于从服务器接收数据的客户端程序中。当我启动程序以接收和观察tcpdump输出时,我观察如下窗口协商:

    11:34:40.257755 IP clientReceiver.42464 > serverSender.8991: 
    S 1742042788:1742042788(0) win 5840 
    <mss 1460,sackOK,timestamp 1688222886 0,nop,wscale 2>
    

    我想知道我哪里出错了。

    http://linux.die.net/man/7/tcp (见对SO_RCFBUF的评论)。

    欢迎您的任何意见。

    3 回复  |  直到 15 年前
        1
  •  8
  •   Andrew McGregor    15 年前

    您还需要使用 TCP_WINDOW_CLAMP

    rcvbuf = 2048;
    setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (char *)& rcvbuf, sizeof(rcvbuf));
    clamp = 1024;
    setsockopt(sock, SOL_SOCKET, TCP_WINDOW_CLAMP, (char *)& clamp, sizeof(clamp));
    

    注意:rcvbuf是夹具的两倍,可能更大。你可以让它自动调谐,车窗夹钳仍然可以工作。这不是便携式的。

        2
  •  4
  •   anon anon    15 年前

    只有在连接套接字之前,才能减小接收缓冲区大小-您可以随时增加它。相对于connect(),您调用sockopt()的顺序是什么?

        3
  •  -6
  •   bluegenetic    15 年前

    recv(短袜、buf、rwnd、0);

    这将接收1024字节。

    推荐文章