2013-07-02 111 views
0

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

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

errno对失败说什么? – Joe

+0

它说101,Nertwork无法访问,但我不明白这是什么意思与无法访问,我可以在同一网络上发送TCP数据包。 – Brknl

+0

仅仅因为TCP连接将遍历网络,并不意味着UDP广播将会。 – Joe

回答

1

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

在我测试过的系统上,尽管地址系列无效,send实际上仍然有一些奇怪的原因,但是您应该首先尝试修复。

0

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

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

设定目的地到127.255.255.255通常会导致数据包通过环回接口(127.0.0.1)发送,这意味着它将能够通过(在这种情况下)是在本地运行的应用程序读取机。