![](/img/trans.png)
[英]Only one socket receives data. Two UDP server sockets bound to same port, different addresses on Windows
[英]Is it a reliable behavior that only one process receives a UDP packet when listening on a forked socket?
我有一个从单个udp套接字读取的服务器应用程序。 在将bind()插入套接字后,将应用程序分叉x次,以便所有工作程序都可以使用对recvfrom()的阻塞调用从同一套接字读取。
我所有的测试都表明,按照先到先服务的方式,接收到数据包时仅返回一个进程。
这是一种可靠的行为吗?还是我需要期望多个进程偶尔为一个同一个数据包返回一次?
数据报套接字就是这样工作的:数据报仅传递给一个线程/进程。
并且,实际上,所有套接字如何工作。 每个套接字都有一个关联的内核发送和接收缓冲区。 套接字上的read/recv/recvfrom/recvmsg
从接收套接字缓冲区中自动消耗到用户空间缓冲区中,内核不在乎哪个线程或进程正在从该套接字读取。 可能有一个以上的文件DESCRIPT 或指相同的内核文件DESCRIPT 离子指的是插座(例如, dup
, fork
),或许多内核文件DESCRIPT 离子指相同的插座(例如,多个进程打开相同的UNIX或UDP (非多播)套接字,使用相同的文件系统名称或addr:port
)。
内核仅针对多播套接字,创建单独的按线程/进程的内核套接字结构,在这种情况下,较低的网络层将接收到的数据报复制到每个套接字缓冲区中,以便每个线程/进程都获得一个副本。
有人在进程池中使用UDP和UNIX套接字进行进程内处理:生产者将数据报发布到套接字中,多个使用者线程在同一个套接字上侦听,而这些线程中只有一个接收数据报。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.