我通过Socket实现不同局域网内的打洞用的是TServerSocket与TClientSocket控件当客户端A收到服务器发来,客户端B请求打洞的信号后,生成TClientSocket向客户端B打一个洞(这个TClientSocket所用的端口我无法确定???)然后再生成一个TServerSocket侦听由NAT生成的INTERINT上的端口号,当客户端B连接客户端A时,为什么无法连接,哪个步骤有错误呢?????我感觉就是生成TClientSocket向B打洞和生成TServerSocket进行侦听这里的端口号设置有问题,具体应该怎么设呢?请高手指点。
用的是TServerSocket与TClientSocket控件
端口一定要相同,TClientSocket的address要是服務器IP
实际上我就是这么做的 只是协议不一样局域网A中客户端A1,通过NAT A 访问服务器S 的端口9999
局域网B中客户端B1,通过NAT B 访问服务器S 的端口9999
此时S知道A1与B1通过各自的NAT转换后在INTERENT上的IP地址与端口打个比方:A1转换后是60.128.20.103:6655
B1转换后是154.27.140.78:8822此时让B1通过这个IP去访问A1应该是行不通的,因为NAT A不会让一个不清楚的IP来访问他内部的机器。
但在连接他的同时,B1就通过这个访问,在NAT B上向A打了个洞,NAT B会认为这个地址与端口的访问是合法的。
此时在B1上打开此端口的侦听,等待A1的访问。S再通知A1向B1发送请求,就会用这个的端口(即前面提到的,打的这个洞)访问B1,从而将A1与B1,用P2P的方式连起来
实际上我就是这么做的 只是协议不一样局域网A中客户端A1,通过NAT A 访问服务器S 的端口9999
局域网B中客户端B1,通过NAT B 访问服务器S 的端口9999
此时S知道A1与B1通过各自的NAT转换后在INTERENT上的IP地址与端口打个比方:A1转换后是60.128.20.103:6655
B1转换后是154.27.140.78:8822此时让B1通过这个IP去访问A1应该是行不通的,因为NAT A不会让一个不清楚的IP来访问他内部的机器。
但在连接他的同时,B1就通过这个访问,在NAT B上向A打了个洞,NAT B会认为这个地址与端口的访问是合法的。
此时在B1上打开此端口的侦听,等待A1的访问。S再通知A1向B1发送请求,就会用这个的端口(即前面提到的,打的这个洞)访问B1,从而将A1与B1,用P2P的方式连起来
他在INTERNET上分配的端口应该都是自动分配的吧?
这里不太明白
但在连接他的同时,B1就通过这个访问,在NAT B上向A打了个洞,NAT B会认为这个地址与端口的访问是合法的。
此时在B1上打开此端口的侦听,等待A1的访问。
-->>实际上NAT B是不会认为合法的,TCP的三次握手没有完成,连接就是失败的,自然不能传数据。
所以如果有NAT的话,外网向内部建立TCP一般都是失败的,因为NAT一般是不开发接收端口的,NAT除非设置了MAP,映向某个端口到内网IP