我做了一个聊天软件,要在广域网上用,为了突破nat环境,我要给服务器传递我的程序运行的端口,我程序的端口是自动生成的,我想得到这个端口传给服务器,不知道怎么得到,请指点一二,谢谢

解决方案 »

  1.   


    你了解nat的概念吗?你的端口?你的端口没有意义。nat路由会用它的端口取代你的端口,并且用它的ip取代你的ip。正因为此,所以同一个局域网内部的人访问服务器时他们的ip是一样的。
      

  2.   

    只给你一个启发:ip和端口由服务器来获得,在.net中叫做RemoteEndpoint,自己google吧!
      

  3.   


    不好意思,我没有说清楚,我要内网端口自动生成是为了传给服务器,服务器把我的内网端口和内网自动生成的端口传给另外一个我要进行通信的客服端(就像qq和另一个qq通信一样),主要用这个内网ip和端口是用于判断是不是在同一个nat后面,如果在同一个nat后面,然后客服端可以直接通信。不过还是谢谢你
      

  4.   


    那就谈不上突破nat了。.net中可以使用dns获得自己(localhost或者127.0.0.1)的所有IPAddress。要注意一个机器会有许多IPAddress,即使判断IPAddress的类新必须是Ipv4的,也不止1个(例如我现在就有3个)。实际上,在局域网内部应该使用udp广播,这样对方就知道广播方的ip和端口,然后根据这个ip向其用于监听的另一个服务端口发送消息。这根本不需要服务器。
      

  5.   

    其实说来说去,我还是觉得你前后说法不一致。客户端访问服务器时确实可以带上本地获取的所有ip号,然后服务器也确实可以用来判断是否这个客户端在nat之后。但是,只有判断客户端地址是公网地址,才进行客户端之间的直接通讯,这就不是指“为了突破nat环境”,而只是用来判断是否“不是nat环境”。当判断nat之后,内网地址就没用了。此时要么打洞,要么服务器转发。但是这都是基于服务器看到的nat路由上反映的ip和端口,也就是说一个客户端向另一个客户端的路由器发送消息,而不是向它的内网地址发送消息,因此内网地址其实是没用的。
      

  6.   

    服务器判断“如果在同一个nat后面”其实是多余的动作,服务器可以不去考虑这个。就算在同一个nat后边,也不能保证他们在同一个网段,谁知道人家的路由器有多少个呢?所以不能就保证他们可以用内网地址就通信了。
      

  7.   

    主要我做的聊天软件要用在广域网上,我把ip和自动生成的端口传给服务器,服务器再把这些信息传给另外一个客户端,我和那另外一个客服端有可能在同一个nat后面,也有可能不在同一个nat后面,但是不管在不在同一个nat后面,我聊天的时候都要判断一下是不是在同一个网段,当然即使使用广播的话也要知道端口,而且我可能要和几个人聊天,所以我想使用不同的端口和他们聊,当然你所说的一台电脑上可能有很多ip,我打算后面处理,思路是如果往一个ip发送不成功的话换另外一个,还真是感谢你
      

  8.   

    这个ip和端口只是判断是不是在同一个网段,确实和nat没关系,谢谢
      

  9.   

    这是P2P通信模组的设计.
    很高效的,QQ就是这种设计.
    至于实现,在下没试过.
    等系统需求来了,出开发一个玩玩.
      

  10.   

    不好意思这两天没来。服务器会给我我要交谈对象的内外网地址和端口(如果我要交谈的对方在线的话),同时也会把我的内外网IP和端口发给我要交谈的对象,然后双方都要向对方的内外网ip和端口发探测报文,然后会得到回答的报文,如果在一定时间内没有得到的话,我就会用服务器中转