【问题标题】:How many bytes can I write at once on a TCP socket?我可以在 TCP 套接字上一次写入多少字节?
【发布时间】:2013-03-13 11:51:45
【问题描述】:

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

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

write(tcp_socket, buffer, 1024);

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

【问题讨论】:

标签: c sockets tcp buffer byte


【解决方案1】:

write() 不保证所有字节都会被写入,因此需要多次调用write()。来自man 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;
}

【讨论】:

  • 所以我可以首先使用任何size,然后我必须检查返回值。对吗?
  • 你为什么把assert()放在那里?怎么可能达到那个条件?
  • @Mike,它是一个循环不变量,我喜欢使用它们。在这个非常小的 sn-p 中可能看起来很愚蠢,但我发现它们很有用。随意拿出来。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

        • 没有。请重新阅读您的来源。这是 IBM z/TPF 上的最大 socket 发送缓冲区大小。它不是在单个send()write() 中可以发送的最大数据量,它仅受int 指定长度的最大值的约束。
        猜你喜欢
        • 2014-03-28
        • 1970-01-01
        • 1970-01-01
        • 2019-12-12
        • 2013-05-25
        • 1970-01-01
        • 2023-03-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多