我有一个UDP服务器和客户端,客户端广播活动消息和服务器捕获它们(代码如下)。当我在ubuntu14.04,16.04,fedora6等几种不同的桌面Linux上运行这些时,它们工作正常。但是当我尝试在mpc8308板上从ltib制作的嵌入式linux上运行它们时,服务器工作(接收来自其他机器的消息),但客户端将errno设置为“network is unreachable”,因为它调用sendto。
我试过wireshark并且没有客户端接口上的数据包,我在板上测试了带有tcpdump的系统,并且没有生成数据包。
下面是代码客户端:
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);
}
编辑:
我检查发送广播消息到子网广播地址和它的工作。但全球广播地址是无法访问的......我认为问题是,OS无法确定它应该使用哪个网络接口来发送这个数据包,但我不知道如何解决它。 EDIT2:
我加了一些选项,我的代码,以便在插槽绑定到特定接口和我上面提到的问题是可以解决的,这工作:
int rc = setsockopts(clientSocket, SOL_SOCKET, SO_BINDTODEVICE, "eth0", 4);
2016-07-26
mhk
+0
听起来更像是一个管理/网络问题,而不是编程相关的问题。 –