无法从端口2368(Linux)C接收UDP流

时间:2012-01-18 12:45:37

标签: c++ linux sockets udp

我目前正在使用激光传感器在端口2368上传送UDP数据流。我可以使用Wireshark查看数据包。

由于我无法发布图像,因此我写了Wireshark为数据包显示的内容:

资料来源:192.168.17.141 目的地:192.168.3.255 协议:UDP 源端口:https(443) 目的地港口:可开放(2368)

但是,我想使用以下示例C程序的套接字来读取数据包:

int main(int argc, char *argv[])
{
   int sock, n, res;
   unsigned int length = 1206;
   char* buffer = new char[1206];  

   sock= socket(AF_INET, SOCK_DGRAM, 0);
   if (sock < 0) error("socket");

   uint16_t udp_port = 2368;
   sockaddr_in my_addr;                    
   socklen_t len = sizeof(sockaddr_in);
   memset(&my_addr, 0, sizeof(my_addr));   
   my_addr.sin_family = AF_INET;           
   my_addr.sin_port = htons(udp_port);    
   my_addr.sin_addr.s_addr = INADDR_ANY;

   cout << my_addr.sin_family << endl;
   cout << my_addr.sin_port << endl;
   cout << my_addr.sin_addr.s_addr << endl;


   res = bind(sock, (sockaddr *)&my_addr, sizeof(sockaddr_in));
   if (res == -1)
     {
       perror("bind");                 
       return -1;
     }


   while (true)
   {
       n = recvfrom(sock,buffer,1,0,NULL,NULL);
       if (n < 0) error("recvfrom");
   }

   close(sock);
   return 0;
}

该计划成功,直至recvfrom()。套接字等待包,没有收到任何东西。我用Winsock为Windows编写了相同的程序,它运行得很好。因为我对Linux操作系统比较陌生,所以我不知道如何解决这个问题,并感谢您的建议!

附加信息:我手动为eth4分配了以下IP和网络掩码(这是设备连接的接口):

IP:192.168.3.5 NM:255.255.255.0

3 个答案:

答案 0 :(得分:1)

设置SO_BROADCAST选项,即使是接收也是如此。根据socket(7)手册页:

  

SO_BROADCAST:
  设置或获取广播标志。启用后,数据报套接字 接收发送到广播地址的数据包 ,并允许它们将数据包发送到广播地址。此选项对面向流的套接字没有影响。

也可能是您的界面配置不正确。验证您是否为相关接口配置了192.168.3.xxx/24地址。

答案 1 :(得分:0)

你有

IP: 192.168.3.5 NM: 255.255.255.0

Source: 192.168.17.141 Destination: 192.168.3.255

如果没有涉及路由器,则无法使用。尝试

IP: 192.168.3.5 NM: 255.255.0.0

作为临时措施,但请阅读IP

修改:也许更好地查看您的激光传感器并将其设置为192.168.3.[something free],直接将目标设为192.168.3.5,然后再调试广播。

答案 2 :(得分:0)

char buffer[1200+6]; /* no need for dynamic buffers */
...
n = recvfrom(sock, buffer, sizeof buffer, 0, NULL, NULL);

BTW你对recvfrom()的使用等同于

n = recv(sock, buffer, sizeof buffer, 0);

,甚至:

n = read(sock, buffer, sizeof buffer);