C ++限制tcp连接的数据

时间:2015-12-29 02:41:35

标签: c++ sockets tcp binary-data bandwidth

我在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连接中写入的字节数是否有限制?我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

  

我可以在TCP / IP连接中写入的字节数有限制吗?我该如何解决这个问题?

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

答案 1 :(得分:0)

  

为什么呢?

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

  

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

限制大约为2 ^ 32字节。

  

我该如何解决这个问题?

跟踪每次写入发送的内容并继续写入,直到写入缓冲区中的所有内容为止。

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