【发布时间】:2012-09-04 18:35:48
【问题描述】:
我在某处读到每个 TCP 连接都有自己的 125kB 输出和输入缓冲区。如果这个缓冲区已满,我仍然继续在 linux 上发送数据会怎样?
根据http://www.kernel.org/doc/man-pages/online/pages/man2/send.2.html,数据包只是默默地丢弃,没有通知我。我能做些什么来阻止这种情况发生?有什么方法可以查明我的至少部分数据是否已正确发送,以便稍后继续?
【问题讨论】:
-
请记住,
send()和各种风格可用于任何类型的套接字、TCP 或 UDP。当写入缓冲区已满时,流套接字应该阻塞,而 UDP 套接字可以(并且将)丢弃它。 -
但我不想让它阻塞,我只想在有空间可用时重试:)
-
阻塞是否意味着我必须等待其他设备下载数据并发送答案:“好的,我收到了数据包。”还是阻塞只是阻塞直到 linux 发送它们?
-
如果你只是想“如果有可用空间重试”,那么将你的套接字置于非阻塞模式并使用 poll、select 或 epoll。
-
另外,TCP 套接字中没有“数据包”之类的东西。 (在较低的 TCP 层,但它不暴露给应用程序)。 TCP 套接字是基于流的。当您调用“发送”时,它不会将数据作为数据包发送。它通过几个数据包发送它。接收数据的应用可能不会一次获取所有数据。
标签: c++ linux sockets tcp buffer