如何在C++中创建客户端UDP套接字,以便它可以监听其他应用程序正在监听的端口?换句话说,我如何在C++中应用端口复用?C++ UDP套接字端口多路复用
回答
我要听只有一个端口上
你可以做到这一点与嗅探器。只要忽略来自不同端口的数据包。
我可能需要从发出一些特定的数据包阻止它,因为我的程序将改为发送它的原始应用程序的
好了,在这里我建议你放弃嗅探器,并使用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个端点(客户端和原始目的地)之间的所有通信。如果您在其他主机上运行“代理”,请使用getsockopt和SO_ORIGINAL_DST
来检索原始目标地址。
这可能听起来很棘手,但是......是的,那是因为它有点棘手:-) 如果我的假设不一致,请参阅防火墙文档。
我想这正是我需要的。 :) 非常感谢。 – SkypeMeSM 2010-10-07 05:51:13
这是不多路复用 - 该术语被保留以供在同一进程在多个信道上处理I/O,并且其中之类的东西select(2)
和poll(2)
是最有用的。
请注意,IP为多播保留了特殊范围的地址(又名组)。这些被映射到特殊的以太网地址。听众将不得不加入多播组,而发件人不必,它只是照常发送。
希望这会有所帮助。
我有一个运行在端口5000上的软件应用程序,我无法修改该应用程序,以便它加入任何多播组或类似地。我想在同一端口上侦听,以便我的代码可以解析该应用程序接收的所有数据包。我有一个概念,这被称为“端口复用”,但我无法找到一个适当的例子。 – SkypeMeSM 2010-10-07 03:43:23
然后拿到Wireshark(http://www.wireshark.org/),嗅探数据包,转储到一个文件中,然后进行处理。 – 2010-10-07 03:48:44
我正在使用wireshark离线查看数据包,但我必须编写一个C++程序,用于在特定端口上嗅探或侦听,而不是在所有端口上,并且它不能脱机。我可以使用libpcap库,但就像我说过的,我只想监听一个端口,我可能需要停止发送某些特定的数据包,因为我的程序将发送它而不是原始应用程序!我不知道我是否很困惑你:) – SkypeMeSM 2010-10-07 04:16:15
这只是数据包嗅探,如tcpdump
或snoop
,打开原始套接字并根据需要从线路和过滤器中拉出所有内容。您可能会想要使用libpcap使事情变得更容易一些。
没有管理员或超级用户权限,您将需要目标应用程序根据平台的需要打开端口SO_REUSEADDR
和SO_REUSEPORT
。警告您只能接收广播和多播数据包,单播数据包将传送到第一个打开的套接字。
好的。因此,在您看来,唯一的另一种选择是使用libpcap来嗅探网络接口上的每个数据包,然后过滤出该特定端口的数据包。我认为,由于这些是UDP数据包(无连接),因此在同一端口上被动/主动发送/接收数据包应该不成问题。 – SkypeMeSM 2010-10-07 04:21:44
我试过,Linux只交付给第一个套接字,它不复用单播数据包。由于性能原因,其他平台可能但不会有所不同。 – 2010-10-08 01:41:59
- 1. UDP C套接字:共享单个端口的多个套接字
- 2. 套接字UDP一个套接字,不同的端口
- 3. 将UDP套接字绑定到多个端口
- 4. Java套接字UDP环路
- 5. UDP套接字和多个回复
- 6. 如何在c中的UDP套接字中设置源端口?
- 7. 多UDP套接字侦听同一端口上的特定源
- 8. C++多UDP套接字数据处理
- 9. 在UDP套接字上查找接口
- 10. “已连接”UDP套接字接收ICMP端口不可达
- 11. 针对多个客户端的C#.NET UDP套接字异步
- 12. UDP - 原始套接字 - C#
- 13. C#中的UDP套接字?
- 14. 多个UDP端口
- 15. 使用Java套接字处理不可达UDP端口
- 16. TCP和UDP套接字可以使用相同的端口吗?
- 17. 使用node.js子进程共享UDP套接字/端口
- 18. TCP套接字到多个IP /端口
- 19. UDP套接字
- 20. Java套接字 - 套接字端口
- 21. 多端口监听套接字linux
- 22. 客户端服务器udp套接字
- 23. Unix域套接字,Udp套接字Objective C使用什么?
- 24. 同一端口套接字上的多个连接C++
- 25. 客户端UDP套接字绑定
- 26. 接收错误与UDP套接字(C++)
- 27. C /如何侦听多个UDP端口
- 28. 开幕Boost.Asio的UDP套接字与临时端口
- 29. 如何将UDP套接字绑定到一系列端口
- 30. 在udp套接字上设置源端口
你为什么要那样做? – jweyrich 2010-10-07 02:56:55
复用仅在套接字的另一端期望复用数据(除非您试图“伪造”另一端期望的数据)时才有用。 – dreamlax 2010-10-07 03:12:35
我想我必须更好地解释这种情况。我有一个运行在端口5000上的应用程序。我想在同一个端口上侦听,以便我可以接收和解析应用程序正在接收的所有数据包。我认为我可以使用SO_REUSEADDR选项来绑定套接字,但是在我的程序在同一个端口上接收数据包之前,这个WAITS使原始应用程序关闭。我希望现在这个问题和理想的行为是清楚的。感谢回复。 – SkypeMeSM 2010-10-07 03:44:50