5

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

如果我想发送一个缓冲区,例如 1024 字节,我可以使用

write(tcp_socket, buffer, 1024);

还是我应该使用多个write()调用,每个调用的字节数都更少?

4

5 回答 5

11

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

写入的字节数可能少于 count,例如,底层物理介质上的空间不足,或者遇到 RLIMIT_FSIZE 资源限制(参见 setrlimit(2)),或者调用被信号处理程序中断后写入少于 count 个字节。(另请参见管道 (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;
}
于 2013-03-13T11:55:41.913 回答
1

根据我的经验,最好保持在 1024 字节的限制

于 2016-11-30T12:34:09.120 回答
0

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

于 2013-03-13T11:57:43.293 回答
0

您可以写入的实际数量取决于套接字的类型。通常,您需要检查返回值以查看实际写入了多少字节。写入的字节数取决于套接字是否处于阻塞模式。

此外,如果套接字阻塞,您可能不想等待所有数据一次性写入。您可能希望一次写一些,以便能够在写操作之间进行其他操作。

于 2013-03-13T11:59:15.820 回答
-3

如您所见,写入套接字的最大缓冲区大小为 1048576 字节。

于 2013-03-13T11:55:02.270 回答