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

时间:2014-11-25 07:13:59

标签: c sockets tcp send recv

我正在设计一款拥有主人和多人的游戏。它们使用TCP套接字发送和接收数据。

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

在玩家之间传输的字符串属于

类型
char chain[2*hops+10];

发件人方的播放器代码是

len = send(to,chain,sizeof(chain),0);
if (len != sizeof(chain)) {
perror("send");
exit(1);}

玩家收到数据的代码如下:

char chain[2*hops+10];
len = recv(current,chain,sizeof(chain),0);

两个玩家的跳数值相同。 对于跳到8000左右的值,它工作正常,但是一旦跳跃值超过某个点,相同的程序就不起作用了。我相信数据不会一次转移。 send和recv缓冲区是否有最大缓冲区大小?

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

s = socket(AF_INET, SOCK_STREAM, 0);

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

1 个答案:

答案 0 :(得分:3)

TCP是面向流的协议(由SOCK_STREAM暗示)。应用程序发送或接收的数据(以[最大大小]块为单位)不会以相同大小的块接收或发送。因此,应该从套接字读取,直到收到足够的数据进行处理,然后尝试处理所述数据,并重复:

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: */
    ;
}

您还可以按照here描述的另一方处理部分send,比以往任何时候都要好得多。