UDP单播:两个进程在相同的udp端口上侦听;只有一个接收数据包

问题描述:

目的: 接收在两个不同进程中发送到单个端口的UDP单播数据包。UDP单播:两个进程在相同的udp端口上侦听;只有一个接收数据包

系统:Linux,语言:C

我能够在两种不同的工艺结合两个插座使用SO_REUSEADDR相同的端口。但是,正如预期的那样,数据包只能在一个中接收(稍后绑定一个)。

是否可以接受两个处理数据包?如果不是,tcpdump如何能够读取但不消耗数据包。

+0

你想要什么?检查数据报? →使用AF_PACKET套接字或libpcap。做一些处理并发送回应? →使用多播。做一些负载平衡? →使用一些负载平衡代理/路由器。 – ninjalj 2012-03-15 19:40:30

为什么单播?这正是多播的目的。

要回答你的第二个问题 - tcpdump得到一个复制它监听的每个数据包的通过一种叫做bpf,并已通过网卡驱动程序的明确支持。

+2

'tcpdump'通过打开一个插在网卡驱动程序(Linux上'netif_rx'中的IIRC)之上的AF_PACKET(或等价物)套接字来放置“tap”来获取数据包。您可以在该套接字的顶部放置一个BPF过滤器来过滤您感兴趣的帧/数据报。 – ninjalj 2012-03-15 19:37:04

+0

是的,我的Linux与传统的BSD世界不同。感谢您的评论。 – 2012-03-15 19:48:55

+0

“通过称为bpf的每个数据包的副本”应该读作“通过称为[第2层AF_PACKET套接字]的每个数据包的副本” – 2016-06-29 22:22:31

这是不可能的套接字API和tcpdump挑选分组右从网络接口,任何TCP/IP处理之前。

你唯一的机会是在一个过程中接收数据包,并将其重新发送到另一个。

+0

虽然过去有些操作系统(Solaris似乎想起来了,尽管我可能是错的),但它允许多个进程打开并读取相同的TCP端口(并且我认为UDP端口)并阅读。这是一种廉价,半透明的负载平衡形式,在实践中并不总是很好。 对于OP:如果你认为你需要这个,你应该重新考虑你的应用程序的设计。虽然我认识到您所描述的内容可能有合法用途,但您很可能走错了路。 – 2012-03-15 14:40:31

+0

这实际上是可能的,但每个TCP连接只能被单个进程读取,其中一个先接受()编辑它。 OP希望从两个套接字读取相同的数据,两次。唉,不能这样做。 – blaze 2012-03-15 15:15:14

如果你打开一个套接字,绑定,听,然后fork()的你的进程,传入的连接请求将被移交,每次以随机选择的,这些过程的单一(我从来没有费心去搞清楚Linux使用的策略,因为它平衡了负载)。

我目前正在测试一个UDP服务器相同的行为。