0

我正在尝试广播数据,但输出是 udp 发送失败。我选择了一个随机端口 33333。我的代码有什么问题?

int main()
{
   struct sockaddr_in udpaddr = { sin_family : AF_INET };
   int xudpsock_fd,sock,len = 0,ret = 0,optVal = 0;

   char buffer[255];
   char szSocket[64];
   memset(buffer,0x00,sizeof(buffer));
   memset(&udpaddr,0,sizeof(udpaddr));

       udpaddr.sin_addr.s_addr = INADDR_BROADCAST;
       udpaddr.sin_port = htons(33333);

   xudpsock_fd = socket(PF_INET,SOCK_DGRAM,IPPROTO_UDP);

   optVal = 1;
   ret = setsockopt(xudpsock_fd,SOL_SOCKET,SO_BROADCAST,(char*)&optVal,sizeof(optVal));
   strcpy(buffer,"this is a test msg");

   len = sizeof(buffer);
   ret = sendto(xudpsock_fd,buffer,len,0,(struct sockaddr*)&udpaddr,sizeof(udpaddr));

       if (ret == -1)
          printf("udp send failed\n");
       else
          printf("udp send succeed\n");

   return (0);
}
4

2 回答 2

1

一个问题是您尝试发送到的地址系列为零 ( AF_UNSPEC)。尽管您AF_INET在函数的顶部将族初始化为,但稍后您使用 将其归零memset

在我测试过的系统上,send尽管地址系列无效,但由于某种奇怪的原因,它实际上仍然有效,但你绝对应该先尝试修复它。

于 2013-07-02T14:02:40.040 回答
0

您的默认路由可能有问题(例如,您没有默认路由)。sendto 需要选择一个接口来发送数据包,但目标地址可能在每个定义的接口的 Destination/Genmask 之外(请参阅“路由”命令行工具)。

尽管这种不匹配,默认路由会捕获此类数据包并通过接口发送它。

将目标设置为 127.255.255.255 通常会导致数据包通过环回接口 (127.0.0.1) 发送,这意味着它可以被本地计算机上运行的应用程序(在这种情况下)读取。

于 2014-03-11T06:33:07.390 回答