2010-10-07 40 views
5

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

+0

你为什么要那样做? – jweyrich 2010-10-07 02:56:55

+0

复用仅在套接字的另一端期望复用数据(除非您试图“伪造”另一端期望的数据)时才有用。 – dreamlax 2010-10-07 03:12:35

+0

我想我必须更好地解释这种情况。我有一个运行在端口5000上的应用程序。我想在同一个端口上侦听,以便我可以接收和解析应用程序正在接收的所有数据包。我认为我可以使用SO_REUSEADDR选项来绑定套接字,但是在我的程序在同一个端口上接收数据包之前,这个WAITS使原始应用程序关闭。我希望现在这个问题和理想的行为是清楚的。感谢回复。 – SkypeMeSM 2010-10-07 03:44:50

回答

3

我要听只有一个端口上

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

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

好了,在这里我建议你放弃嗅探器,并使用MITM技术。

你需要依靠PREROUTING防火墙规则来转移的数据包发送到“代理”应用程序。假设UDP,Linux和iptables的,而“代理”在同一台主机上运行,​​这里是什么“代理”实际上需要做的:

添加防火墙规则来转移的包(做手工,如果你喜欢):

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

2.绑定和监听<newport>

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

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

+0

我想这正是我需要的。 :) 非常感谢。 – SkypeMeSM 2010-10-07 05:51:13

1

这是不多路复用 - 该术语被保留以供在同一进程在多个信道上处理I/O,并且其中之类的东西select(2)poll(2)是最有用的。

你要求的是multicast。基本示例为Here

请注意,IP为多播保留了特殊范围的地址(又名组)。这些被映射到特殊的以太网地址。听众将不得不加入多播组,而发件人不必,它只是照常发送。

希望这会有所帮助。

+0

我有一个运行在端口5000上的软件应用程序,我无法修改该应用程序,以便它加入任何多播组或类似地。我想在同一端口上侦听,以便我的代码可以解析该应用程序接收的所有数据包。我有一个概念,这被称为“端口复用”,但我无法找到一个适当的例子。 – SkypeMeSM 2010-10-07 03:43:23

+0

然后拿到Wireshark(http://www.wireshark.org/),嗅探数据包,转储到一个文件中,然后进行处理。 – 2010-10-07 03:48:44

+0

我正在使用wireshark离线查看数据包,但我必须编写一个C++程序,用于在特定端口上嗅探或侦听,而不是在所有端口上,并且它不能脱机。我可以使用libpcap库,但就像我说过的,我只想监听一个端口,我可能需要停止发送某些特定的数据包,因为我的程序将发送它而不是原始应用程序!我不知道我是否很困惑你:) – SkypeMeSM 2010-10-07 04:16:15

2

这只是数据包嗅探,如tcpdumpsnoop,打开原始套接字并根据需要从线路和过滤器中拉出所有内容。您可能会想要使用libpcap使事情变得更容易一些。

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

+0

好的。因此,在您看来,唯一的另一种选择是使用libpcap来嗅探网络接口上的每个数据包,然后过滤出该特定端口的数据包。我认为,由于这些是UDP数据包(无连接),因此在同一端口上被动/主动发送/接收数据包应该不成问题。 – SkypeMeSM 2010-10-07 04:21:44

+0

我试过,Linux只交付给第一个套接字,它不复用单播数据包。由于性能原因,其他平台可能但不会有所不同。 – 2010-10-08 01:41:59