我正在开发一个Java客户机/服务器应用程序,它涉及通过TCP进行P2P通信。我正在尝试实现TCP穿孔,如下所述:http://www.brynosaurus.com/pub/net/p2pnat/#sec-tcp。这需要同时侦听并尝试使用同一本地TCP端口建立传出连接。显然,如果使用so_reuseaddr
套接字选项,这应该可以工作,我正在通过Java中的setreuseaddress()
方法进行设置。然而,这并不像我预期的那样奏效。下面是一些测试代码:
import java.io.IOException;
import java.net.*;
public class Test {
public static void main(String args[]) {
new Thread() {
public void run() {
try {
ServerSocket ss = new ServerSocket();
ss.setReuseAddress(true);
ss.bind(new InetSocketAddress(7077));
ss.accept();
} catch (Exception e) {
System.out.println("ServerSocket exception: " + e.getMessage());
}
}
}.start();
Socket s;
while (true) {
s = new Socket();
try {
s.setReuseAddress(true);
s.bind(new InetSocketAddress(7077));
s.connect(new InetSocketAddress("192.168.0.103", 7077));
break;
} catch (Exception e) {
System.out.println("Socket exception: " + e.getMessage());
try { s.close(); } catch (IOException e1) { }
try { Thread.sleep(1000); } catch (InterruptedException e1) { }
}
}
}
}
这在Windows7中可以正常工作:serversocket
在自己的线程中侦听端口7077,套接字重复尝试连接到192.168.0.103:7077。然而,在Linux(Ubuntu)下,只有第一次套接字连接尝试起作用,随后的尝试得到“Address已经在使用”bindexception
。既然启用了so_reuseaddr
选项,难道我不应该从我同时监听的TCP源端口建立传出连接,并在关闭套接字后立即重用本地端口号吗?
在Linux中,两个套接字都需要设置SO_REUSEADDR套接字选项。因此,如果我们希望两个套接字sock1和sock2绑定到同一个端口,那么只有当sock1和sock2都设置了SO_REUSEADDR时,s2才能重用端口/地址。
我目前正在开发一款网络游戏。在游戏中,需要通过TCP和UDP将数据从服务器发送到客户端。实现UDP漏洞穿孔很容易,但我不太确定如何实现TCP漏洞穿孔: null 是3。或者是4。该怎么走?
大多数人似乎都通过UDP使用NAT穿孔,但在我的例子中,我需要使用TCP(这是事实,在有人问“为什么不使用UDP?”之前)我找不到任何示例代码或至少一个适当的教程。我能找到的都是理论上的附属物,但没有使用套接字或TCPClients(我更喜欢套接字)。 有人能给我链接一些示例代码吗?我可以用这些示例代码连接两个NAT后的客户端,或者用示例代码链接到完整的教程?我知道在.NET中很难实现这个目标(我
现在,我可以通过NAT建立连接,但只能使用连接套接字: 但现在,发送SYN数据包进行连接的两个套接字已经连接。 你会认为我会做的,通过两个NATs得到一个连接,万岁。
我知道这个话题并不新鲜。虽然存在各种信息,但健壮的解决方案并没有出现(至少我没有找到)。我有一个用python3编写的P2P守护进程,pie上的最后一个元素是通过TCP连接NAT后面的两个客户端。我得此主题得参考资料: https://bford.info/pub/net/P2pnat/ 如何使两个客户机在连接了一个汇点服务器后直接连接? TCP穿孔问题 到目前为止我所做的: 服务器: 现在,当前
问题内容: 我试图在Java中实现UDP-Holepunching的简单草图以测试其概念,并稍后在我的C / C ++应用程序中使用它。 从Wikipedia来说,我的理解是:A和B是未定义网络结构背后的客户端,C是著名的公共可访问服务器。 A将数据包发送到服务器C,服务器保存其IP地址和端口。C将获得A的NAT的公共IP地址。这样做,A前面的NAT将创建一条路由,该路由会将此端口上的所有数据包传
我正在尝试用Boost::ASIO实现NAT打孔。根据我的理解,NAT穿孔器的工作原理是这样的(UDP/TCP): 客户端A绑定到端口并连接到服务器S,客户端B执行相同操作。 当S同时接收到请求和匹配时,它将A的ip和端口发送给B,B发送给A。 a和B接收对方的ip和端口,现在它们从同一端口向对方发送消息并形成连接(因为它们正在等待回复?) 如果没有成功的或,我似乎无法运行任何。当然,当目标端口没