一次可以使用套接字发送和接收的最大数据大小?(TCP 套接字)

kai*_*rav 1 c sockets tcp send recv

我正在设计一个具有主和多个玩家的游戏。它们使用 TCP 套接字发送和接收数据。

玩家通过 TCP 套接字在他们之间传输字符串。程序在 red hat linux 6 os 中执行。

玩家之间传递的字符串类型为

char chain[2*hops+10];
Run Code Online (Sandbox Code Playgroud)

发送方的播放器代码是

len = send(to,chain,sizeof(chain),0);
if (len != sizeof(chain)) {
perror("send");
exit(1);}
Run Code Online (Sandbox Code Playgroud)

播放器接收数据的代码是这样的:

char chain[2*hops+10];
len = recv(current,chain,sizeof(chain),0);
Run Code Online (Sandbox Code Playgroud)

两个玩家的跳数是一样的。对于直到 8000 左右的跃点值,它工作正常,但是一旦跃点值超过某个点,相同的程序就无法运行。我相信数据不是一次性传输的。发送和接收缓冲区是否有最大缓冲区大小?

注意:它们之间的套接字使用以下代码打开:

s = socket(AF_INET, SOCK_STREAM, 0);
Run Code Online (Sandbox Code Playgroud)

然后通常连接和绑定两侧的套接字。

Mic*_*kis 5

TCP 是面向流的协议(如 暗示的那样SOCK_STREAM)。应用程序发送或接收的数据(在 [maximum-sized] 块中)不会以相同大小的块接收或发送。因此,应该从套接字读取数据,直到接收到足够的要处理的数据,然后尝试处理所述数据,并重复:

while (true) {
    unsigned char buffer [4096] = {};

    for (size_t nbuffer = 0; nbuffer < sizeof buffer
                           ; nbuffer = MAX(nbuffer, sizeof buffer)) { /* Watch out for buffer overflow */
        int len = recv (sockd, buffer, sizeof buffer, 0);

        /* FIXME: Error checking */

        nbuffer += len;
    }

    /* We have a whole chunk, process it: */
    ;
}
Run Code Online (Sandbox Code Playgroud)

您还可以send按照此处所述处理另一侧的部分s ,这比我以往任何时候都好。

  • TCP 窗口与 OP 试图实现的行为无关。TCP 是_可靠的流服务_,而不是_可靠的数据包传送_系统。为了更好地了解其含义,我通常推荐 Robert Graham 的 [这篇文章](http://blog.erratasec.com/2014/04/fun-with-ids-funtime-3-heartbleed.html)。 (2认同)