我在tcp/ip
中的localhost中的客户端和服务器之间编写了一个简单的c++
连接。它通过tcp / ip发送一个unsigned char
数组。此数组的大小如下:
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
连接中写入的字节数是否有限制?我该如何解决这个问题?
答案 0 :(得分:2)
我可以在TCP / IP连接中写入的字节数有限制吗?我该如何解决这个问题?
是的 - 您的TCP堆栈(可能是您的操作系统的一部分)不会让您的应用程序排入任意数量的数据,可能会占用应用程序外的荒谬数量的缓冲内存。相反,它具有有限的缓冲区大小,在此之后,您需要循环并将更多数据排入缓冲区 - 通过进一步调用write
- 在实际发送了一些之后网络。所以 - 从上一次发送停止的地方循环并重新发送:如果你的套接字没有设置为非阻塞,则调用将阻塞,直到有更多缓冲区空间可用。
答案 1 :(得分:0)
为什么呢?
可能有几个原因。可能存在某种物理限制(硬件)。客户端缓冲区可能已满。可能已达到某种实施限制。可能已收到某种信号。
我可以在TCP / IP连接中写入的字节数有限制吗?
限制大约为2 ^ 32字节。
我该如何解决这个问题?
跟踪每次写入发送的内容并继续写入,直到写入缓冲区中的所有内容为止。
我没有添加样本,因为第一个问题可以通过检查write()的文档来回答,第二个问题可以通过快速搜索来回答,第三个问题已经有很多样本了。< / p>