我正在设计一款拥有主人和多人的游戏。它们使用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);
然后是两侧常用的连接和绑定套接字。
答案 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
,比以往任何时候都要好得多。