最近做了一个UDP的服务器程序,
发现一个奇怪的现象:
我在局域网内开通本地(IP:192.168.1.35)的8900的UDP端口服务,
这个端口由局域网的网关映射到本机IP。
在实际的测试中,
外部网的主机可以发送数据包到我的UDP服务器,
我的服务器可以收到,
但是,
我返回数据发送给外网的客户机的时候,
外部客户机就无论如何也收不到了!!!但我如果在局域网内用客户机连接我的UDP服务器,
就一点问题也没有!
另外,我的服务器如果改为单线程,自始至终只用一个服务器socket的方式和客户机通信,
也可以和客户机正常通信,
但只能同时和一台客户机通信。
基本模型如下:
server_sock = socket(...);
bind(server_sock,...);
recvfrom(server_sock, recv_buf, sizeof(recv_buf), 0, &from_addr, &from_len);
sendto(server_sock, send_buf, sizeof(send_buf), 0, (sockaddr *)&from_addr, sizeof(from_addr));
即必须始终和外网的一个客户机用server_sock 这个本地套接字通信才行。
谁知道问题出在哪里了,该怎么修改???

解决方案 »

  1.   


    listen(s,20); 
    //s是套接字描述符,20是等待连接队列的最大长度,而不是在一个端口上同时可以进行连接的数目,
    //如果有21个请求同时来请求时,20个进等待请求连接列队中,而最后一个连接请求就被拒了。
        
      

  2.   

    udp来说本来就用这个socket就行了阿
    难道你的服务器用多线程就可以绑定多个端口?!
      

  3.   

    另外,我的服务器如果改为单线程,自始至终只用一个服务器socket的方式和客户机通信,
    也可以和客户机正常通信, 
     
       那么重点检查你的多线程的代码。还有,UDP socket会出现丢包的情况!!!
      

  4.   

    This subject confuse me so long a time,
    until now , I haven't get the right answer.
    and haven't draw conclusion about this.If anyone know it,
    pls tell me.
      

  5.   

    这个是NAT的问题,如果外网和你的机器通信了NAT就建立了个虚拟的通道,如果你换用其他的socket建立另一个端口进行发送,NAT是有可能不让你通过的。要取决于NAT的类型的。局域网没有端口映射问题,所以是可以通信的