一次可以在TCP套接字上写多少个字节?

问题描述:

正如标题所说,在面向连接的套接字上一次可写入的字节数是否有限制?一次可以在TCP套接字上写多少个字节?

如果我要发送的缓冲,例如,1024个字节,我可以用一个

write(tcp_socket, buffer, 1024); 

,或者我应该使用多个write()电话与每一个字节的低量?

+0

可能的[C++套接字编程TCP最大规模的http://stackoverflow.com/a/12934115/1758762 – duDE 2013-03-13 11:55:39

+0

可能重复重复/ ip socket Buffer?](http://stackoverflow.com/questions/12931528/c-socket-programming-max-size-of-tcp-ip-socket-buffer) – 2013-03-14 23:26:00

write()并不保证所有字节都将被写入,因此需要多次调用write()。从man write

写入可以小于字节的比计数如果,例如,有底层物理介质上的空间不足,或RLIMIT_FSIZE资源限制遇到的数量(见的setrlimit(2)) ,或者在写入少于计数字节之后,调用被信号处理程序中断。 (参见配管(7)。)

write()返回写入这样的运行总计写入的字节必须保持和用作指标的字节数为buffer并且计算剩余的字节数是书面:

ssize_t total_bytes_written = 0; 
while (total_bytes_written != 1024) 
{ 
    assert(total_bytes_written < 1024); 
    ssize_t bytes_written = write(tcp_socket, 
            &buffer[total_bytes_written], 
            1024 - total_bytes_written); 
    if (bytes_written == -1) 
    { 
     /* Report failure and exit. */ 
     break; 
    } 
    total_bytes_written += bytes_written; 
} 
+0

所以我可以使用任何'size',然后我必须检查返回值。这样对吗? – JustTrying 2013-03-13 11:58:12

+1

@JustTrying,更新了示例代码。 – hmjd 2013-03-13 12:01:33

+1

为什么你把'assert()'放在那里?怎么可能达到这个条件? – Mike 2013-03-13 12:23:23

如您所见write socket最大缓冲区大小为1048576字节。

+0

不需要请重新阅读你的源代码。这是* z/TPF上的最大*套接字发送缓冲区大小*,无论如何。它不是你可以在一个'send()'或'write()'中发送的最大数据量,它只受限于指定长度的int的最大值。 – EJP 2013-03-14 01:36:17

没有固有的限制。 TCP/IP将根据需要对数据包进行分段和重组。您的系统可能会施加(可能可调)的上限,但它可能在多MB范围内。请参阅您的手册页中的setsockopt()并始终检查write()的返回值。

您可以编写的实际金额取决于套接字的类型。通常,您需要检查返回值以查看实际写入的字节数。写入的字节数可能会有所不同,具体取决于套接字是否处于阻止模式。

另外,如果套接字被阻塞,您可能不想等待所有数据一次写入。您可能需要一次编写一些代码,以便在写入操作之间进行其他操作。

从我的经验,最好是留在1024字节的限制