【发布时间】:2017-04-25 14:04:18
【问题描述】:
我正在修改现有应用程序中的一些基础架构,该应用程序将 UDP 数据包发送到 1...N 个地址(通常是多播)。目前,假设有 T 个发送器对象,并且在某些情况下,所有发送器都发送到同一个地址。
所以为了简化并提供一个示例,假设有 3 个发送器对象,它们都需要发送到一个特定的地址。我的问题是......哪个更有效?:
选项 1) 在单个套接字周围放置一个互斥体,并让所有发送器 (T) 共享同一个套接字。
T----\
T----->Socket
T----/
选项 2) 使用三个单独的套接字,都发送到同一个位置。
T----->Socket 1
T----->Socket 2
T----->Socket 3
我怀疑使用第二个选项,在后台,操作系统或 NIC 在最终传输周围放置了一个互斥锁,因此从总体上看,选项 2 可能与选项 1 没有太大不同。
下周我可能会在我的开发 PC 上设置一个实验,但我无法测试用户可能安装的所有潜在计算机配置。我也意识到有不同的实现 - Windows 与 Linux,不同的 NIC 芯片组制造商等,但我想知道是否有人可能有一些过去的经验或架构知识,可以阐明一个选项相对于另一个选项的优势。
谢谢!
【问题讨论】:
-
UDP 是无连接的,UDP 数据报是自包含的网络数据包。手动序列化对单个套接字的访问没有任何好处,网络堆栈确实会在传输过程中为您处理序列化。我会让每个发射器使用自己的插座,然后让它们爆炸。
标签: c++ sockets architecture udp ip-address