C++ 限制 tcp 连接上的数据
C++ limit data on tcp connection
我在 c++
的本地主机中写了一个简单的 tcp/ip
客户端和服务器之间的连接。它通过 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
连接中写入的字节数有限制吗?我该如何解决这个问题?
is there a limit in the number of bytes that I can write in a TCP /IP connection? How can I solve this problem?
是 - 您的 TCP 堆栈(可能是操作系统的一部分)不会简单地让您的应用程序排队任意数量的数据,这可能会在您的应用程序之外占用荒谬数量的缓冲内存。相反,它有一个有限的缓冲区大小,在缓冲区已满之后,您需要循环并在缓冲区中排队更多数据 - 通过进一步调用 write
- 在一些数据实际上已经通过网络发送之后。所以 - 循环并从上次发送停止的地方重新发送:如果您的套接字未设置 non-blocking,调用将阻塞,直到有更多缓冲区 space 可用。
Why?
可能有几个原因。可能存在某种物理限制(硬件)。客户端缓冲区可能已满。可能已经达到某种实施限制。可能已经收到某种信号。
is there a limit in the number of bytes that I can write in a TCP /IP connection?
限制在 2^32 字节左右。
how can I solve this problem?
跟踪每次写入发送了多少并继续写入,直到缓冲区中的所有内容都已写入。
我没有添加示例,因为第一个问题可以通过查看 write() 的文档来回答,第二个问题可以通过快速搜索来回答,而第三个问题已经有很多示例了.
我在 c++
的本地主机中写了一个简单的 tcp/ip
客户端和服务器之间的连接。它通过 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
连接中写入的字节数有限制吗?我该如何解决这个问题?
is there a limit in the number of bytes that I can write in a TCP /IP connection? How can I solve this problem?
是 - 您的 TCP 堆栈(可能是操作系统的一部分)不会简单地让您的应用程序排队任意数量的数据,这可能会在您的应用程序之外占用荒谬数量的缓冲内存。相反,它有一个有限的缓冲区大小,在缓冲区已满之后,您需要循环并在缓冲区中排队更多数据 - 通过进一步调用 write
- 在一些数据实际上已经通过网络发送之后。所以 - 循环并从上次发送停止的地方重新发送:如果您的套接字未设置 non-blocking,调用将阻塞,直到有更多缓冲区 space 可用。
Why?
可能有几个原因。可能存在某种物理限制(硬件)。客户端缓冲区可能已满。可能已经达到某种实施限制。可能已经收到某种信号。
is there a limit in the number of bytes that I can write in a TCP /IP connection?
限制在 2^32 字节左右。
how can I solve this problem?
跟踪每次写入发送了多少并继续写入,直到缓冲区中的所有内容都已写入。
我没有添加示例,因为第一个问题可以通过查看 write() 的文档来回答,第二个问题可以通过快速搜索来回答,而第三个问题已经有很多示例了.