问题描述
我用php写一个客户端程序,目的是像服务器端发送一个udp包,当服务器端接收到我发送的udp包后,就像我udp包中数据段里指定的IP和端口连续发送udp包,由客户端接收并处理,我现在从客户端发送的udp包服务器端已经接收到了,但是我无法知道自己客户端所在机器的公网IP和端口,以至于无法从服务器端接收到其发送的udp包,客户端机器是通过路由上网的。在向服务器发送UDP包时,由路由做了IP和端口的转换。求解我该如何得到经过转换以后的公网IP和端口

解决方案 »

  1.   

    这个应该只有你的服务器端,绑定固定的端口号,还有接受所有IP的请求,时刻循环监听端口,准备接受请求数据;应该是可以收到任何计算机发送的udp的数据包的
      

  2.   


    客户端如何知道自己的公网IP和端口?  我的客户端有可能是在路由器后面访问公网的,在发送时路由会自动的做IP和端口的映射转换成公网的IP和端口,我现在需要这个转换完的公网IP和端口啊
      

  3.   

    你要搞p2p?
    通过服务器直接转发udp压力很大的,一般都打洞串联两个内网客户端。
    你要知道的内网通过NAT转换成公网ip和端口,服务端负责接收后肯定知道的呀。
      

  4.   

    不是P2P  服务器知道  但是服务器端返回的包中没有公网的IP和端口号   这个公网的IP和端口号我只能从服务器端获得么?
      

  5.   

    你根本就不知道 UDP 协议时干什么的
      

  6.   

    QQ用的就是UDP协议,也不用知道你客户端的什么地址,你在网吧里也能聊天的说。感觉好像是你编程的问题。
      

  7.   

    PHP也有socket相关的函数  而且这个功能也不复杂  问题是  如何能得到客户端的公网IP和port
      

  8.   

    公网ip好说,你访问个ip查询网页,比如
    http://www.ip138.com/ips8.asp
    然后正则匹配公网地址
    但是端口就难说了,NAT是自动给你的的第一次udp请求随机设置个端口号,一段时间内缓存住。
    如果你能控制udp服务器端代码的话,往返回包里加入公网ip+端口是比较稳妥的。
      

  9.   

    公网IP我的确是用这个办法获得的  但是端口实在是没办法了
    可惜我控制不了服务器端的代码啊  不过最近用笨办法起码能接受到服务器端发的UDP包了
    不过又出了个新问题   因为服务器端是不断的往客户端发送UDP包的 但是发送间隔不一定,于是会产生2个问题:
    1.我的PHP程序不断的接受服务器发送的UDP包,会不会造成客户机的不稳定,因为客户机是一个网站服务器,会导致其他访问问题不会。
    2.接受到的服务器UDP包都会有重复,虽然用抓包工具看到重复的包的序号是不同的,但是包的数据段一样,这是什么原因,我是用while(recvfrom(socket...))来接受的,会是这里的原因么?
      

  10.   

    #1,这个接收udp的程序最好是一个命令行下执行的php进程,这样就不会影响web server了啊,就是一个常驻进程而已
    #2,这个应该和你的运行环境有关,多网卡?虚拟机下运行?
      

  11.   

    #1.命令行下执行的PHP进程是什么意思?
    #2.我是在我自己电脑上测试的,当时应该是用的无线连的公网。  换到别的环境里就不会出现同一个包就收俩次的问题了?
      

  12.   

    意思是cli环境下运行php,监听udp返回包,不要网页执行
      

  13.   

    我现在在本机的windows上用的easyphp做的   需要手动配置php.ini文件来修改cli的路径么?
    有没有相关的详细点的资料可以看的? 谢谢
      

  14.   

    不需要的,你就找找php安装的目录,命令行cd进去,然后直接用命令php -f 执行php文件,
    这样不用挂在apache下执行。第二个问题你不妨把代码放到别的机器测试下。看是不是网络环境的问题。
      

  15.   

    php -f的确可以执行了  不过也有警告说在C:/php目录下没有socket.dll动态库 应该是我还没有配置好路径
    不过如何在php页面中调用我写的cli程序呢?第二个问题我回去用其他机器试试