錯誤號我在 sendto function setting "network is unreachable" errno 類似的問題,(不象)UDP Broadcast sendto failed:「network is unreachable」 on linux 2.6.30但這個問題不回答是很老了,我試圖在這裏重申他們希望得到更多的解釋和答案。
Ç的sendto函數集「網絡不可達」在linux2.6.29
我有一個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);
我從 Bind UDP listening socket to specific interface (or find out the interface a datagram came in from)借這個代碼片斷。
聽起來更像是一個管理/網絡問題,而不是編程相關的問題。 – Olaf