【问题标题】:Problem with simple UDP client/server application简单 UDP 客户端/服务器应用程序的问题
【发布时间】:2010-12-04 19:57:01
【问题描述】:

好的。所以我有一个简单的客户端程序通过 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;
}

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

【问题讨论】:

  • 我已经简化了程序,所以只有与套接字相关的基本内容。我知道阅读很长的代码 sn-ps 很痛苦。
  • 确保两台机器上的所有防火墙都被禁用...很多防火墙会过滤传入的UDP数据包。
  • @Jeremy Friesner 我确定了这一点。 100% 确定我已在两台 PC 上完全卸载了防火墙。
  • 为什么只打印每五次迭代接收的字节数? (也许您只是很不走运 - 五分之四的消息成功,但每五分之一都失败了。)您是否在调试器中单步执行过?
  • @Ciaran Keating 好吧,因为图像应该非常快(每秒 25-30 个)所以我希望能够用我的眼睛看到发生了什么。

标签: c++ sockets udp


【解决方案1】:

这不是一个解决方案,但您的代码应该检查iRcvdbytes 是否有错误,就像发送代码检查sendto 的结果一样。

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

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

【讨论】:

  • 谢谢。我将在星期一尝试(我没有时间早点去实验室),并让您知道这是否会导致问题。
  • recvfrom 只会在面向连接的套接字上正常关闭时返回 0。
  • UDP 中没有优雅关闭这样的东西。这是一个 TCP 概念。
  • 好的。我今天不能去实验​​室测试这个。我可能会在星期四测试它。请继续关注这个问题,并在本周晚些时候检查它:) 我必须在实验室进行测试,因为我的客户端实际上不是普通 PC,而是 Aldebaran NAO 机器人(基本上我正在尝试将图像从机器人流式传输到服务器 PC )。
  • @Richard - 当你留下这样的评论时,它会弹出来提醒我重新签到,所以当你有任何消息时就这样做。祝你好运。
猜你喜欢
  • 2018-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多