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)
然后通常连接和绑定两侧的套接字。
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 ,这比我以往任何时候都好。