2014-11-25 182 views
0

我正在设计一个拥有主控和多个玩家的游戏。他们使用TCP套接字发送和接收数据。一次可以使用套接字发送和接收的最大数据大小?(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左右它工作正常,但一旦啤酒花值越过某个点,相同的程序不起作用。我相信数据不会一次转移。 发送和接收缓冲区是否有最大缓冲区大小?

注:

s = socket(AF_INET, SOCK_STREAM, 0); 

,然后双方平时的连接和绑定插座:它们之间的插座使用此代码打开。

+0

我认为它的256字节,但等待答案.. – 2014-11-25 07:24:02

+2

@pranitkothari这是不是这样的事情。请不要在这里发表猜测。 – EJP 2014-11-25 07:37:45

回答

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 s,特别比以往任何时候都好。

+0

TCP支持超过10亿字节的发送窗口。因此,如果您的操作系统和网络基础架构可以支持它并且您的应用程序需要它,您可以使用非常大的发送缓冲区 – 2014-11-25 07:34:07

+1

TCP窗口与OP试图实现的行为无关。 TCP是_reliable流service_,而不是_reliable数据包delivery_系统。为了深入了解这种影响,我通常会推荐Robert Graham的[这篇文章](http://blog.erratasec.com/2014/04/fun-with-ids-funtime-3-heartbleed.html)。 – 2014-11-25 08:25:44