Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 广播发送失败_Sockets_Udp_Broadcast_Sendto - Fatal编程技术网

Sockets 广播发送失败

Sockets 广播发送失败,sockets,udp,broadcast,sendto,Sockets,Udp,Broadcast,Sendto,我正在尝试广播数据,但输出为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))

我正在尝试广播数据,但输出为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);
}

一个问题是您试图发送到的地址族为零(
AF_unsec
)。虽然在函数顶部将族初始化为
AF_INET
,但稍后可以使用
memset
将其归零


在我测试的系统上,尽管地址族无效,但由于某种奇怪的原因,
send
实际上仍能正常工作,但您应该首先尝试修复它。

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

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


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

errno对故障有何解释?它说101,NerNetwork无法访问,但我不明白这意味着什么,如果无法访问,我可以在同一个网络上发送tcp数据包。仅仅因为tcp连接将穿越网络,并不意味着UDP广播将穿越网络。请参阅以下链接:我解决了问题。我更改了udpaddr.sin\u addr.s\u addr=INADDR\u广播;至udpaddr.sin_addr.s_addr=inet_addr(“127.255.255.255”);这很有效,但我不明白为什么。