我正在开发一个广泛使用的 C 应用程序插座。
我的疑问是:我创建的每个套接字是否都有自己的缓冲区来发送和/或从其他套接字接收消息?
换句话说,套接字是否会受到消息交换的影响错误地?
我所说的错误是指发送到一个套接字的消息可以“泄漏”到另一个套接字,而无需编写(并且可能是错误的)程序代码将消息从“预期”接收器显式传输到另一个套接字。
答案1
我创建的每个套接字是否都有自己的缓冲区来发送和/或从其他套接字接收消息?
是的。
否则,套接字 API 基本上将无法使用,这正是您所建议的原因。
只是为了澄清,因为您没有指定您使用的套接字类型:
每个 TCP/流套接字都有自己独特的发送和接收缓冲区。
这些缓冲区对于在后台处理重新发送、确认管理、重组等是必需的。
每个 UDP/数据报套接字都有自己的接收缓冲区,但不一定有唯一且持久的发送缓冲区。
它没有任何需要持久发送缓冲区的重传逻辑。
a
socketpair
可以在两个套接字之间共享一个缓冲区(或在每个方向上共享一个缓冲区)为了进行比较,a
pipe
(与套接字不同)通常只有一个在两个文件描述符之间共享的缓冲区,因为它是单向的。
答案2
是的,这就是 TCP 和 UDP 的用途:多路复用网络。建立许多虚拟网络。
IP只是发送数据包。它们可以是任何东西,只是从这台机器转到那台机器。没有渠道,没有重新发送,只是尝试传递它。这就是互联网的工作原理。
TCP 和 UDP 向此添加通道(套接字)。 TCP增加了重发。会不会出错:
- 应使用校验和来检测数据损坏。校验和是否足够强大(对于 TCP 可能不够,但硬件层具有良好的校验和)。
- 在软件中,您可能会编写错误并向错误的通道/套接字发送/接收。
- 但是,您无法在您的进程未打开的套接字上发送/接收(除非您由另一个进程传递文件句柄)。