5

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

4

3 回答 3

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检索原始目标地址。

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

于 2010-10-07T05:23:23.450 回答
2

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

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

于 2010-10-07T04:14:24.667 回答
1

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

您要的是多播是基本示例。

请注意,IP 为多播保留了一个特殊的地址范围(也称为组)。这些被映射到特殊的以太网地址。侦听器必须加入多播组,而发送者不必,它只是像往常一样发送。

希望这可以帮助。

于 2010-10-07T03:35:55.363 回答