Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何按触发时的相同顺序处理多个套接字_C_Sockets_Networking - Fatal编程技术网

C 如何按触发时的相同顺序处理多个套接字

C 如何按触发时的相同顺序处理多个套接字,c,sockets,networking,C,Sockets,Networking,我需要使用poll、epoll或select监视多个套接字。但在我的例子中,套接字的读取顺序是至关重要的。我必须按照触发套接字的相同顺序处理它 使用select()和poll()时,不能保证顺序,因为我们必须遍历所有套接字,并找到哪一个已就绪 我知道epoll只返回触发事件的描述符列表。但是这里的订单有保证吗 更多信息-我正在使用netlink套接字侦听内核的各种更新。我为arp更新、路由更新和接口相关更新打开了不同的套接字。如果套接字的读取顺序与内核发送的顺序不同,我将面临不同的问题。(在收到

我需要使用poll、epoll或select监视多个套接字。但在我的例子中,套接字的读取顺序是至关重要的。我必须按照触发套接字的相同顺序处理它

使用select()和poll()时,不能保证顺序,因为我们必须遍历所有套接字,并找到哪一个已就绪

我知道epoll只返回触发事件的描述符列表。但是这里的订单有保证吗


更多信息-我正在使用netlink套接字侦听内核的各种更新。我为arp更新、路由更新和接口相关更新打开了不同的套接字。如果套接字的读取顺序与内核发送的顺序不同,我将面临不同的问题。(在收到接口关闭消息之前,先处理路由删除消息)

可能是一个错误。也许值得解释一下您试图解决的问题的大背景,以防case有更好/不同的解决方法。我认为在您的特定用例中,答案是使用一个
NETLINK\u ROUTE
socket。即使
epoll
确实对事件引发的顺序做出了一些保证。。。。netlink套接字通常在每次recv调用时返回多条消息,因此使用
NLMSG\u NEXT
NLMSG\u DONE
宏。因此,
recvmsg
调用中的多条消息可能是“无序的”,即使您按顺序为所有套接字提供服务。我唯一的其他建议是去看看“NetworkManager”是做什么的,因为它可能是使用netlink套接字的最广泛的长期运行进程。我同意@BrianMcFarland。使用一个插座。那你就不可能出毛病了。如果必须使用倍数,则必须使用线程,而不是
select()/poll()/epoll(),
,但即使这样,也不能保证顺序。您可能需要重新考虑您的要求。@Brian-谢谢。在哪里可以找到networkmanager源代码。