我有一个类似的问题,在sendto函数设置“networking不可达”errno和( 不太像 ) UDP广播发送失败:“networking是无法访问”在Linux 2.6.30但因为这个问题没有回答,是相当古老我试过重申他们在这里更多的澄清,希望得到答案。
我有一个UDP服务器和客户端,客户端广播活动消息和服务器捕获它们(代码如下)。 当我在ubuntu14.04,16.04,fedora6等几个不同的桌面Linux上运行这些工作,他们工作的很好。 但是,当我尝试从一个ltib制造的embedded式linux上运行mpc8308板,服务器工作(接收来自其他机器的消息),但客户端设置errno“networking无法访问”,因为它调用sendto。
我尝试了wireshark,并没有从客户端的接口上的数据包,我用板上的tcpdumptesting了系统,没有生成的数据包在那里。
这里是客户端的代码:
int clientSocket, portNum, nBytes; char buffer[1024]; struct sockaddr_in serverAddr; socklen_t addr_size; /*Create UDP socket*/ clientSocket = socket(AF_INET, SOCK_DGRAM, 0); int broadcastEnable=1; int retsockopts=setsockopt(clientSocket, SOL_SOCKET, SO_BROADCAST, &broadcastEnable, sizeof(broadcastEnable)); /*Configure settings in address struct*/ serverAddr.sin_family = AF_INET; serverAddr.sin_port = htons(12021); serverAddr.sin_addr.s_addr = htonl(INADDR_BROADCAST); memset(serverAddr.sin_zero, '\0', sizeof serverAddr.sin_zero); /*Initialize size variable to be used later on*/ addr_size = sizeof serverAddr; while(1){ sprintf(buffer,"I AM ALIVE"); nBytes = strlen(buffer) + 1; int err; err = sendto(clientSocket,buffer,nBytes,0,(struct sockaddr *)&serverAddr,addr_size); if(err==-1) //error occured { printf("error sending alive message: %s\n",strerror(errno)); } sleep(5); }
编辑:
我检查发送广播消息子网广播IP地址,它的工作。 但全球广播地址是无法访问…我认为问题是,操作系统无法确定哪个networking接口,它应该用于发送这个数据包,但我不知道如何解决它。 EDIT2:
我添加了一些选项到我的代码,以便套接字绑定到一个特定的接口和我上面提到的问题可以解决,这工作:
int rc = setsockopts(clientSocket, SOL_SOCKET, SO_BINDTODEVICE, "eth0", 4);
我从绑定UDP侦听套接字借用了这个代码片断到特定的接口(或者找出一个数据报从哪个接口进来) 。
你的代码很好。 问题在于你的网络管理。
您缺少默认路由。 默认的路由可能是由你的DHCP服务器提供的,你可能必须在你的网络配置文件中指定它,否则你可能不得不发出一个类似route add default gw 192.0.2.1
的命令。