用MFC写了个服务端程序,之前在局域网测试程序的时候,tcp和udp数据收发没有任何问题,可是将程序放在租用的vps主机上的时候,tcp数据收发没有问题,udp收发不到数据。直接用调试工具来进行数据收发,问题依旧,由于用的是windows 2003操作系统,找到本地策略,取消了udp指派任务,这时服务端能收到客户端发来的udp数据,但是却始终给客户端发送不成功,这里客户端的IP是根据客户端给服务端发送数据后,服务端获取的客户端的公网IP,端口双方事先约定好的,请高手指点迷津!

解决方案 »

  1.   

    需要在客户端用的路由器里面添加一个端口映射的条目.
    TPLINK 几十块钱的就有这功能.打开管理页一看就知道
      

  2.   

    lz可以这样,
    假如客户端在私网内,IP:PORT = 192.168.0.2:55555
    在路由器上设置一下端口映射 192.168.0.2:55555,
    路由器可以自动做NAT转换,
    会自动将客户端公网IP绑定到内网的端口,,,,,
      

  3.   

    假设:
    你客户端的内网私网IP:PORT = 192.168.0.2:55555
    客户端的公网IP = 123.123.123.123,
    做好端口映射后,路由器会自动绑定,123.123.123.123:55555,
    路由器可以自动做NAT转换,,,,,
      

  4.   

    看样子大伙的一致看法是都是客户端的公网和私网的端口映射问题,我也认同这一说法,但是有一点我不太明白,很多聊天软件比如说QQ,用的就是UDP传输,尤其是在视频或语音聊天的时候,那为什么它就不用做什么端口映射?不要说人家是腾讯,技术多牛逼之类的话,我只知道,它没改变我的路由器配置
      

  5.   


    lz应该问你浏览http网页的时候为什么路由器没有做端口映射?
    QQ CLIENT有个固定的登录SERVER IP,
    CLIENT登录时会把自己的公网IP发给SERVER,
    QQ的C/S架构基本上自己实现了OSI模型的TCP/IP之上应用层的一些协议,
    这个HTTP这一层是相等的,
    所以不需要路由器做端口映射,
    但是lz的TCP/UDP这一层就需要lz自己实现一些协议细节了,,,,,
      

  6.   

    renxu350说的好像有点道理,有没有不用端口映射简单修改程序就可以实现公网和私网的UDP通信?
      

  7.   


    TCP可以,
    UDP是不基于连接的,
    UDP可以在私网内通过广播获取对方的IP,
    但在公网似乎不太现实,
    如果有高人能实现UDP公网这样通信,
    那就能高人来实现吧,,,,,
      

  8.   

    其实我这个也需要注册,在客户端通过tcp登录我的服务器之后,服务器已经知道了该客户端的公网IP,端口按事先约定好的,可是数据传输是单向的,应该还是端口映射的问题
      

  9.   

    你必须确保客户端首先发UDP报文给你公网服务器,且周期性继续发,从而保证网关给你开辟的临时通道畅通,从服务器首先发起的通讯总会遇到你这样问题的
      

  10.   


    我认为TCP如果约定好端口,理论上不需要端口映射,,,,,
      

  11.   

    再理一下:
    前提:服务器在公网上有固定IP
    1、服务器IP和UDP接收端口固定,任何客户端都知道,客户端给这个端口发UDP数据没问题,服务器也能收到。
    2、一旦客户端给服务器发数据,服务器就获取到该客户端的公网IP了,就会给该IP指定端口发UDP数据,可是这时候客户端却收不到数据,关键问题就在这,根据目前的状态,做端口映射不太现实,因为你根本不知道客户端在哪给你发数据,不可能指定客户端来做端口映射。
      

  12.   

    恩,TCP是有连接的,测试一直没有问题,关键是udp的问题
      

  13.   

    结贴,准备自己搞个无线网关(3g或gprs)来实现
      

  14.   

    无意间看到自己半年前的帖子,回头看看,觉得当时有些幼稚,功能已实现,做个总结吧!
    其实公私网之间UDP传输根本不需要什么端口映射,也不需要配置路由器什么的,就好像QQ、迅雷或者其他一些视频、语音传输软件一样,本地接收端口可以而且应该为随机端口。
    实现过程其实很简单,大概是:私网都是客户端,在做完初始化工作后(创建socket、绑定本地端口),要向公网指定UDP端口注册(姑且认为是注册或者报到吧,反正要发点东西,让服务器知道你的存在),公网根据发来的注册信息,解析出客户端的IP和端口,注意,关键就是这里的端口,并不是私网绑定时的端口号,而是经过一系列路由后的端口号,只要公网给这个IP和端口发数据,又反向经过一系列路由到达私网客户端,在整个过程中,不必关心中间过程的IP和端口号变化,总之一句话:公网收到哪个IP和端口的数据,就给该IP和端口发数据就对了。
    使用注意事项:
    1、这种公私网之间的UDP通信,一般都伴有TCP连接,靠TCP来注册和发送控制命令,UDP传输数据
    2、公私网之间的路由一旦建立,就需要心跳来维持,否则路由器在指定时间会断掉无数据收发的路由,时间一般几分钟到十几分钟不等。