每个套接字都有自己的缓冲区来发送/接收消息吗?

每个套接字都有自己的缓冲区来发送/接收消息吗?

我正在开发一个广泛使用的 C 应用程序插座

我的疑问是:我创建的每个套接字是否都有自己的缓冲区来发送和/或从其他套接字接收消息?

换句话说,套接字是否会受到消息交换的影响错误地

我所说的错误是指发送到一个套接字的消息可以“泄漏”到另一个套接字,而无需编写(并且可能是错误的)程序代码将消息从“预期”接收器显式传输到另一个套接字。

答案1

我创建的每个套接字是否都有自己的缓冲区来发送和/或从其他套接字接收消息?

是的。

否则,套接字 API 基本上将无法使用,这正是您所建议的原因。

只是为了澄清,因为您没有指定您使用的套接字类型:

  • 每个 TCP/流套接字都有自己独特的发送和接收缓冲区。

    这些缓冲区对于在后台处理重新发送、确认管理、重组等是必需的。

  • 每个 UDP/数据报套接字都有自己的接收缓冲区,但不一定有唯一且持久的发送缓冲区。

    它没有任何需要持久发送缓冲区的重传逻辑。

  • asocketpair可以在两个套接字之间共享一个缓冲区(或在每个方向上共享一个缓冲区)

    为了进行比较,a pipe(与套接字不同)通常只有一个在两个文件描述符之间共享的缓冲区,因为它是单向的。

答案2

是的,这就是 TCP 和 UDP 的用途:多路复用网络。建立许多虚拟网络。

IP只是发送数据包。它们可以是任何东西,只是从这台机器转到那台机器。没有渠道,没有重新发送,只是尝试传递它。这就是互联网的工作原理。

TCP 和 UDP 向此添加通道(套接字)。 TCP增加了重发。会不会出错:

  • 应使用校验和来检测数据损坏。校验和是否足够强大(对于 TCP 可能不够,但硬件层具有良好的校验和)。
  • 在软件中,您可能会编写错误并向错误的通道/套接字发送/接收。
  • 但是,您无法在您的进程未打开的套接字上发送/接收(除非您由另一个进程传递文件句柄)。

相关内容