C ++ UDP套接字端口复用

时间:2010-10-07 02:41:13

标签: c++ sockets udp multiplexing

如何在C ++中创建客户端UDP套接字,以便它可以侦听另一个应用程序正在侦听的端口?换句话说,如何在C ++中应用端口多路复用?

3 个答案:

答案 0 :(得分:3)

  

我只想听一个端口

你可以用嗅探器做到这一点。只需忽略来自不同端口的数据包。

  

我可能需要阻止它发送一些特定的数据包,因为我的程序将发送它而不是原始的应用程序

好的,我建议您丢弃嗅探器,并使用MITM技术。

您需要依靠PREROUTING防火墙规则将转发数据包转移到“代理”应用程序。假设在同一主机上运行UDP,Linux,iptables和“代理”,这就是“代理”实际需要做的事情:

1。将防火墙规则添加到转移数据包(如果您愿意,可以手动执行):

iptables -t nat -A PREROUTING -i <iface> -p <proto> --dport <dport>
    -j REDIRECT --to-port <newport>

2。绑定并聆听<newport>

3. :中继2个端点(客户端和原始目标)之间的所有流量。如果您在其他主机上运行“代理”,请使用getsockoptSO_ORIGINAL_DST来检索原始目标地址。

这可能听起来很棘手,但是......是的,那是因为它有点棘手:-) 如果我的假设不同,请查阅防火墙文档。

答案 1 :(得分:2)

这只是像tcpdumpsnoop那样的数据包嗅探,打开一个原始套接字并根据需要从线路和过滤器中提取所有内容。您可能希望使用libpcap来使事情变得更容易。

如果没有管理员或超级用户权限,您将需要目标应用程序根据平台打开SO_REUSEADDRSO_REUSEPORT端口。需要注意的是,您只能接收广播和组播数据包,单播数据包将被传送到第一个打开的套接字。

答案 2 :(得分:1)

这是多路复用 - 该术语保留用于在同一进程中处理多个通道上的I / O,以及select(2)poll(2)之类的内容最有用。

您要求的是multicastHere是基本的例子。

请注意,IP会为多播保留一系列特殊地址(即k.a.组)。这些映射到特殊的以太网地址。监听器必须加入组播组,而发送者不必,它只是像往常一样发送。

希望这有帮助。