我要做一个客户端与服务器端的通信的程序,服务器端是固定IP的网络服务器,为什么我能从我局域网的客户端发送数据到服务器端,服务器端接收数据成功,并根据发送内容回发相应相应的UDP包到数据,但客户端此时不能收到网络服务器上的服务端的UDP包。但如果服务端(服务端程序)都在局域网内测试,完全没有问题,客户端能收到服务端返回的信息。谁有这方面的经验,求高手指点?

解决方案 »

  1.   

    因为中间经过了NAT,外网主动发起的连接会被丢弃,所以才有那么多打洞、穿透的解决办法
    http://www.cnblogs.com/Contlu/archive/2004/11/27/69543.html
    http://topic.csdn.net/u/20090922/14/b420e263-fa9e-4768-993d-3d9ae20151a7.html参考
      

  2.   

    内网是局域网,外网有路由器,两个路由器之间如果没有通信过,来的信息会被丢掉。你的信息被丢掉了所以就没办法通信,需要打洞,你在网上搜udp打洞就能够解决。
      

  3.   

    网络没学好啊
    要掌握4种常规UDP打洞方式
      

  4.   


    UDP完全可以打洞,而且UDP比TCPd打洞的成功率高好多倍。问题是你这里是如何“发送”的?
      

  5.   

    客户端必须是会话发起者。
    在服务端接收到客户端的消息的同时获得客户端的IP:PORT,服务端发送数据则发送到这个IP:PORT。这个IP:PORT是服务端动态获取的,而不是事先约定好的。明白这一点应该就没有你说的那个问题了。
    C++中通过sockaddr_in6结构获得客户端IP信息,例如:sockaddr_in6 tRecvProps;
    socklen_t nRecvPropLen;
    const int nBuffLen = 4096;
    char pBuff[nBuffLen]; while (!m_bExit)
    {
    nRecvPropLen = sizeof(sockaddr_in6);
    int numBytes = recvfrom(m_hSocket, pBuff, nBuffLen, 0, (sockaddr*)&tRecvProps, &nRecvPropLen); if (numBytes < 0)
    {
    printf("Socket I/O error: recvfrom returned an error\n");
    continue;
    }
    if (numBytes < 1)
    {
    continue;
    } if (nRecvPropLen != sizeof(sockaddr_in) && nRecvPropLen != sizeof(sockaddr_in6))
    {
    printf("I/O error: invalid sockaddr length\n");
    continue;
    }
      int nPort = ntohs(tRecvProps.sin_port);  // 这个就是PORT了

    m_nBytesRead += numBytes; OnReceive(pBuff, numBytes, addr);
    }C#应该也有类似的方法
      

  6.   

    这种带公网IP的情况不需要NAT穿透的,只要有心跳就行了。