1

我开发了一个应用程序,其中客户端和服务器可以使用 UDP 套接字相互通信。我在客户端使用了回环地址,在服务器端使用了 INADDR_ANY。该程序在同一台机器上运行良好。但是当我尝试从另一台机器上运行客户端时,通信失败了。这是代码片段: 服务器:

    #define PORT 8888   //The port on which to listen for incoming data
   if (WSAStartup(MAKEWORD(2,2),&wsa) != 0)
      {
         exit(EXIT_FAILURE);
      }

   ///Create a socket///
   if((socketIdentifier = socket(AF_INET , SOCK_DGRAM , 0 )) == INVALID_SOCKET)
      {                 
        //"Socket not created"
      }

   ///Socket Created///

   ///Prepare the sockaddr_in structure///
   serverSocket.sin_family = AF_INET;
   serverSocket.sin_addr.s_addr = INADDR_ANY;
   serverSocket.sin_port = htons( PORT );

   ///Bind///
   if( bind(socketIdentifier ,(struct sockaddr *)&serverSocket , sizeof(serverSocket)) == SOCKET_ERROR)
      {             
        //"Bind Failed"
      }

   ///Bind Done///
   if((recv_len = recvfrom(socketIdentifier, receiveBuffer, sizeof(receiveBuffer), 0, (struct sockaddr *) &clientSocket, &clientSocketLength)) == SOCKET_ERROR)
      {
        "Could not Receive Data"
      }
 hDeviceContext = BeginPaint(AH_Glb_windowHandle, &ps );
                TextOut(GetDC(AH_Glb_windowHandle),10,10+i,receiveBuffer,recv_len);
                EndPaint( AH_Glb_windowHandle, &ps );

客户:

   #define PORT 8888   //The port on which to listen for incoming data
    #define SERVER "58.65.172.11"  //ip address of udp server
      ///Initialise winsock///
       if (WSAStartup(MAKEWORD(2,2),&wsa) != 0)
          {
             //Socket Initialization Failed///
             exit(EXIT_FAILURE);
          }

       ///create socket///
       if ((socketIdentifier=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == SOCKET_ERROR)
          {
             ///Socket Creation Failed///
             exit(EXIT_FAILURE);
          }

       ///setup address structure///
       memset((char *) &connectedSocket, 0, sizeof(connectedSocket));
       connectedSocket.sin_family = AF_INET;
       connectedSocket.sin_port = htons(PORT);
       connectedSocket.sin_addr.S_un.S_addr = inet_addr(SERVER);
       if (sendto(socketIdentifier,sendBuffer,strlen(sendBuffer) , 0 , (struct sockaddr *) &connectedSocket, sizeof(connectedSocket)) == SOCKET_ERROR)
          {
             MessageBox(NULL,
                        "Sending Failed",
                        "Failure",
                        MB_ICONINFORMATION);            
             exit(EXIT_FAILURE);
          }
4

1 回答 1

3

任何人都可以向我解释这是怎么发生的吗?

不看代码,我可以猜到你的路由器阻塞了端口。

第一的 ..

我正在使用我的 IP 网站来查找运行服务器的机器的 IP。如果客户使用本网站生成的 IP 地址进行通信,则通信无效。

因为这给了你网络的外部IP 地址。由您的 ISP 分配给您的那个。您的路由器位于您的计算机(或网络)和互联网之间,默认情况下会阻止所有外部入站通信。

然后 ...

但是当我使用 ipconfig 命令查找服务器机器的 IP 时,我找到的 IP 地址与我的 IP 网站生成的 IP 地址不同,现在当我尝试通过 ipconfig 生成的服务器 IP 地址与客户端通信时,通信正常.

原因 ipconfig 为您提供了LAN 中路由器分配的本地IP。

路由器为了保护其背后的本地网络,会过滤所有入站通信,除非您明确告诉他们不要这样做。

当您第一次尝试连接到服务器时,您使用了路由器阻止的外部 IP地址。第二次使用从那里获得的本地 IP地址ipconfig很好,因为路由器不会阻止这些。

这是一个简单的图表......

Client (local IP)--------
                        |
                     Router --- Internet (external IP)
                        |
Server (local IP)--------

如果你想从互联网上的任何地方访问服务器,那么你需要在你的路由器中转发端口,这样服务器将对外界可见。但在向世界开放之前,请务必保护服务器机器和您的应用程序。

如果您只是在测试或者您将仅在您的网络内使用此服务器,那么只需使用本地 IP。另外,尝试为服务器分配一个静态 IP 地址,这样您就可以在代码中使用它而无需重新编译代码。

于 2013-03-11T05:36:42.620 回答