简单UDP客户端/服务器应用程序的问题

时间:2010-12-04 19:57:01

标签: c++ sockets udp

确定。所以我有一个简单的客户端程序通过UDP将图像发送到指定的IP地址。在指定的IP上,服务器程序正在侦听并应接收图像。

当我在localhost上尝试两个程序时(即它们都运行在127.0.0.1),它可以工作,服务器接收图像。当我尝试将客户端和服务器程序放在同一网络中的不同PC上时,它不起作用。

147.232.24.163是服务器IP,147.232.24.150是客户端IP。

这是我的客户端程序:

  // Initialize UDP.    
  struct sockaddr_in server;    
  int n_sent;
  int socketId = socket(AF_INET, SOCK_DGRAM, 0);    
  if (socketId < 0)    
  {    
    cout << "Problem creating socket." << endl;    
  }    
  server.sin_family = AF_INET;    
  server.sin_addr.s_addr = inet_addr("147.232.24.163");    
  // Establish the server port number - we must use network byte order!    
  server.sin_port = htons(42001);

  for ( int iter = 0; iter < 60; iter++ )    
  {
      // load image into jpegBuf

      n_sent = sendto(socketId, reinterpret_cast<char*> (&jpegBuf[0]), jpegBuf.size(), 0, (struct sockaddr*) &server, sizeof(server));    
      if (n_sent < 0) {    
        cout << "Problem sending data." << endl;    
      }    
  }

  close(socketId);

这是我的服务器程序:

int main()
{
    int bufferSize = 1024000;
    int iSockFd = -1;
    int iLength = 0;
    struct sockaddr_in servAddr, cliAddr;
    char buff[bufferSize];
    iSockFd=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    memset(&servAddr, 0, sizeof(servAddr));
    memset(&cliAddr, 0, sizeof(cliAddr));

    servAddr.sin_family = AF_INET;
    servAddr.sin_addr.s_addr = inet_addr("147.232.24.163"); 
    servAddr.sin_port = htons(42001);
    int cliAddrLen = sizeof(struct sockaddr_in);
    int bindRet = bind(iSockFd, (struct sockaddr*)&servAddr, sizeof(servAddr));
    cout << "Bind returned " << bindRet << endl;

    int i = 0;
    while (true)
    {
        int iRcvdBytes=recvfrom(iSockFd, buff, bufferSize, 0, 
        (struct sockaddr*)&cliAddr, (socklen_t*)&cliAddrLen);

        if (0 == i % 5)
        {
            cout << "Received " << iRcvdBytes << " bytes from the client" << endl;
        }


        i++;
    }
    close(iSockFd);
    return 0;
}

任何想法为什么它不起作用?我没有收到任何错误消息。

1 个答案:

答案 0 :(得分:2)

这不是解决方案,但您的代码应该检查iRcvdbytes错误,方法与发送代码检查sendto的结果相同。

返回0意味着套接字正常关闭(如果面向连接 - 这里不适用),SOCKET_ERROR表示错误(至少在WinSock2中)。

发送方的套接字需要使用IPPROTO_UDP创建,而不是0.这肯定会导致您的失败。