繁体   English   中英

在派生套接字上侦听时,只有一个进程接收UDP数据包是一种可靠的行为吗?

[英]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 离子指的是插座(例如, dupfork ),或许多内核文件DESCRIPT 离子指相同的插座(例如,多个进程打开相同的UNIX或UDP (非多播)套接字,使用相同的文件系统名称或addr:port )。

内核仅针对多播套接字,创建单独的按线程/进程的内核套接字结构,在这种情况下,较低的网络层将接收到的数据报复制到每个套接字缓冲区中,以便每个线程/进程都获得一个副本。

有人在进程池中使用UDP和UNIX套接字进行进程内处理:生产者将数据报发布到套接字中,多个使用者线程在同一个套接字上侦听,而这些线程中只有一个接收数据报。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM