Java P2P 网络,对不同的入站和出站连接使用相同的端口
Java P2P networking, using same port for different inbound and outbound connections
我正在实现一个对等网络应用程序,该应用程序涉及向所有对等点发送初始握手,然后在侦听特定端口时进行异步通信。因此,我首先需要使用同一端口将握手发送到不同的对等方,我的应用程序随后将监听该端口。我对我们是否可以将两个不同的套接字绑定到同一个本地端口感到有些困惑,但它给了我一个绑定异常。我不确定如何做到这一点。
套接字必须具有唯一的 <source address, source port, protocol (tcp/udp), destination address, destination port>
个元组。
所以是的,只要远程地址不同,就可以通过将 SO_REUSEADDR
套接字选项设置为 true 来重新使用本地端口。
但这不是必须的。 bittorrent 协议不要求将传出连接的本地端口设置为任何特定端口。您根本不必绑定传出连接。您可以简单地让 TCP 堆栈找出正确的接口和端口。
只有您的侦听套接字需要绑定到您宣布的端口。也不需要特定地址,您可以使用 unspecified address、::0
(对于 v4/v6 双堆栈套接字)或 0.0.0.0
(仅限 v4)。
so, I have to do a handshake from a port same as the one i have announced to the tracker
规范并未在任何地方说明这一点。
我正在实现一个对等网络应用程序,该应用程序涉及向所有对等点发送初始握手,然后在侦听特定端口时进行异步通信。因此,我首先需要使用同一端口将握手发送到不同的对等方,我的应用程序随后将监听该端口。我对我们是否可以将两个不同的套接字绑定到同一个本地端口感到有些困惑,但它给了我一个绑定异常。我不确定如何做到这一点。
套接字必须具有唯一的 <source address, source port, protocol (tcp/udp), destination address, destination port>
个元组。
所以是的,只要远程地址不同,就可以通过将 SO_REUSEADDR
套接字选项设置为 true 来重新使用本地端口。
但这不是必须的。 bittorrent 协议不要求将传出连接的本地端口设置为任何特定端口。您根本不必绑定传出连接。您可以简单地让 TCP 堆栈找出正确的接口和端口。
只有您的侦听套接字需要绑定到您宣布的端口。也不需要特定地址,您可以使用 unspecified address、::0
(对于 v4/v6 双堆栈套接字)或 0.0.0.0
(仅限 v4)。
so, I have to do a handshake from a port same as the one i have announced to the tracker
规范并未在任何地方说明这一点。