我通过Socket实现不同局域网内的打洞用的是TServerSocket与TClientSocket控件当客户端A收到服务器发来,客户端B请求打洞的信号后,生成TClientSocket向客户端B打一个洞(这个TClientSocket所用的端口我无法确定???)然后再生成一个TServerSocket侦听由NAT生成的INTERINT上的端口号,当客户端B连接客户端A时,为什么无法连接,哪个步骤有错误呢?????我感觉就是生成TClientSocket向B打洞和生成TServerSocket进行侦听这里的端口号设置有问题,具体应该怎么设呢?请高手指点。

解决方案 »

  1.   

    NND,我真的不知道打洞是什么功能
    用的是TServerSocket与TClientSocket控件 
    端口一定要相同,TClientSocket的address要是服務器IP
      

  2.   

    我猜测的实现,要使用UDP才行吧A---1 NAT 2------SERVER------3 NAT 4-------BA通过server 知道 点3的IP和端口,同理B通过server知道点2的IP和端口,这样A,B之间互相使用2,3的IP和端口就可以通信了,不需要再另外开端口侦听了呵呵,纯属猜测
      

  3.   

    to rxiao99 :
    实际上我就是这么做的   只是协议不一样局域网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的方式连起来
      

  4.   

    to rxiao99 :
    实际上我就是这么做的   只是协议不一样局域网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的方式连起来
      

  5.   

    我现在是这么做的不知道对不对而且不太清楚,是不是在客户端B1向A1打洞时,是不是需要控制自身使用的端口呢??
    他在INTERNET上分配的端口应该都是自动分配的吧?
    这里不太明白
      

  6.   

    是用的TCP吗?觉得TCP是不行的,使用了连接此时让B1通过这个IP去访问A1应该是行不通的,因为NAT A不会让一个不清楚的IP来访问他内部的机器。 
    但在连接他的同时,B1就通过这个访问,在NAT B上向A打了个洞,NAT B会认为这个地址与端口的访问是合法的。 
    此时在B1上打开此端口的侦听,等待A1的访问。 
    -->>实际上NAT B是不会认为合法的,TCP的三次握手没有完成,连接就是失败的,自然不能传数据。
      

  7.   

    to rxiao99 :是吗   为什么呢???高手三次握手是什么意思?
      

  8.   

    TCP是面向连接的,开始客户端A与服务器端B有三次握手过程,A发SYN,B回SYN ACK,A再回ACK,这样正式建立连接,才可以发数据。而UDP是非连接的,直接将数据包发到目的IP端口。
    所以如果有NAT的话,外网向内部建立TCP一般都是失败的,因为NAT一般是不开发接收端口的,NAT除非设置了MAP,映向某个端口到内网IP
      

  9.   

    是啊   现在我要做的就是穿透NAT网上的资料挺多的,不过都是C#的看不太明白就是要利用NAT不开放端口,只开放发送端口这个性质是客户端C1先向客户端C2进行连接,这时应该是连不上的。但C1的NAT会记录下此次连接,因为他向C2发送了数据,所以C2再向C1访问时,NAT会认为些访问有效,可转致C1
      

  10.   

    如果不做穿透NAT,无论TCP或是UDP都无法进行连接
      

  11.   

    对于UDP,NAT会保留一个映射表,这样只要A向3发过数据,从3回来2的数据NAT就会传回给AA---1 NAT 2------SERVER------3 NAT 4-------B 
      

  12.   

    TCP没有吗???就是说这个只能用UDP来做了?
      

  13.   

    TCP也应该有,只是两个NAT之间TCP建立不了连接,发不了数据
      

  14.   

    看来这个问题很严重啊我这有一个C#用TCP连的,不过我看不懂我觉得C#可以实现,DELPHI应该也是可以的吧
      

  15.   

    实在不行就先换UDP做一下哎  看来还是太年轻啊   呵呵
      

  16.   

    楼主犯了原理性错误,NAT穿透只能使用无连接的UDP协议来实现。
      

  17.   

    改用UDP了   但是UDP如果实现多线程,是不是要在每个线程中都Create TUDPServer而我创建了很多的TUDPServer,如何进行单一控制呢