2016-07-26 57 views
2

錯誤號我在 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)借這個代碼片斷。

+0

聽起來更像是一個管理/網絡問題,而不是編程相關的問題。 – Olaf

回答

3

你的代碼沒問題。問題在於您的網絡管理。

您缺少默認路由。默認路由可能由您的DHCP服務器提供,您可能必須在您的網絡配置文件中指定它,或者您可能必須發出諸如route add default gw 192.0.2.1之類的命令。

+0

Thnx。它的工作......我也找到了解決問題的辦法從第二編輯在我的文章中提到的C代碼。 – mhk

+0

但是如果我需要在所有接口上廣播呢? – mhk