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() 的文档来回答,第二个问题可以通过快速搜索来回答,而第三个问题已经有很多示例了.