我正在尝试广播数据,但输出是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);
}
答案 0 :(得分:1)
一个问题是您尝试发送的地址系列为零(AF_UNSPEC
)。虽然您将该系列初始化为该功能顶部的AF_INET
,但您稍后会使用memset
将其归零。
在我测试过的系统上,尽管地址族无效,但send
实际上仍有一些奇怪的原因,但你应该先尝试修复它。
答案 1 :(得分:0)
您的默认路线可能有问题(例如,您没有路线)。 sendto需要选择一个接口来发送数据包,但目标地址可能在每个定义的接口的目的地/ Genmask之外(参见'route'命令行工具)。
默认路由捕获此类数据包,并通过接口发送,尽管这种不匹配。
将目标设置为127.255.255.255通常会导致数据包通过环回接口(127.0.0.1)发送,这意味着它可以被本地计算机上运行的应用程序读取(在这种情况下)