2015-12-29 49 views
0

我在c++的本地主机上编写了客户端和服务器之间的一个简单的tcp/ip连接。它通过tcp/ip发送一个数组unsigned char。该数组的大小如下:关于tcp连接的C++限制数据

unsigned char *bytes = (unsigned char*)malloc(sizeof(unsigned char)*96000000); 

//array is filled 

然而,当我写插座

n = write(sockfd,bytes,96000000); 
    if(n<0){ 
     cout << "error writing"<< endl; 
     exit(1); 
    } else{ 
     cout << "bytes written " << n <<endl; 
    } 

写入字节(n变量),其标准输出打印出是5196978而不是数目对正如我所料,96000000。为什么?我可以在TCP /IP连接中写入的字节数有限制吗?我怎么解决这个问题?

回答

2

我可以在TCP/IP连接中写入的字节数是否有限制?我怎么解决这个问题?

是 - 你的TCP协议栈(操作系统的一部分可能)不会简单地让你的应用程序排队任意数据量,有可能占用了你的应用程序之外的荒谬金额缓冲存储器中。相反,它具有有限的缓冲区大小,在完成之后,您应该循环并将更多数据排入缓冲区 - 在进一步调用write后 - 通过网络实际发送一些数据。所以 - 循环并从上一次发送停止的地方重新发送:如果你的套接字没有被设置为非阻塞,则该呼叫将阻塞,直到有更多的缓冲空间可用。

+0

所以我要循环也是在服务器端,而我读? –

+0

@ L.Joe服务器端有点不同 - 你可以要么* *循环或 - 在支持它的实现方式 - 使用'MSG_WAITALL'标志,请参阅['recv'](http://linux.die.net/人/ 2/RECV)。 –

0

为什么?

可能有几个原因。可能有某种物理限制(硬件)。客户端缓冲区可能已满。某种实现限制可能已经达到。可能收到某种信号。

我可以在TCP/IP连接中写入的字节数有限制吗?

该限制约为2^32字节。

我该如何解决这个问题?

跟踪每次写入发送多少,并一直写入,直到写入缓冲区中的所有内容。

我没有添加样本,因为通过检查write()的文档可以回答第一个问题,第二个问题可以通过快速搜索得到解答,第三个问题已经有很多样本。