最近一直在做P2P软件.可是外网与内网通信一直困扰着我.
请高手指点一下.
具体情况:
软件采用C/S结构.
服务器有公网IP
客户端可以在公网或者内网.
遇到的问题就是当客户端在内网.无法收到服务端发来的数据.
请各位高手指点一下.最好有源码

解决方案 »

  1.   

    http://www.ppcn.net/show.aspx?id=1306&cid=2说得很白的穿透原理.
      

  2.   

    这个问题对我也重要,我可以加入实验,我可以提供固定IP给做服务器
    MSN:[email protected]
      

  3.   

    很久的问题了~!现在我有能力回答了...//遇到的问题就是当客户端在内网.无法收到服务端发来的数据.    为啥收不到?请确定你服务器的数据向那发了?内网主机向外网通过UDP进行通信,需经过内网的网关.在内网机器里,你可能是定制好了,我是从内网机器的1234端口发信息到外网机器的1234端口.而返回就直接向内网机器的1234端口发送.问题出现了,这个由服务器向内网机器发送的信息被内网的网关丢掉了.所以,内网就收不到了!为什么?其实呐,内网机器向外网发送信息,在经过网关时,信息的头内容被改变了.到了外网机器那时,就不是1234->1234这个端口对应关系了,可能是60000->1234这样!这就是网关的转换啦.
        好了,情况说明,解决方法也简单.从MSDN得知,UDP通信时,Winsock的RemoteHost与RemotePort属性是可以随便更改的.也知道了RemoteHostIP就是跟你通信的机器的IP,也知道RemotePort就是跟你通信的机器的端口.只要内网机器向外网机器发送UDP数据时,外网机器在DataArrival事件发生时,调用GetData取得数据后,就可以通过RemoteHostIP与RemotePort,知道对方的IP和端口了,这时再把自己的RemotePort与RemoteHost属性改为相应的端口与IP就可以返回信息给内网机器了!