2016-07-26 7 views
2

Ich habe ein Problem ähnlich dem in sendto function setting "network is unreachable" errno und (weniger wie) UDP Broadcast sendto failed:“network is unreachable” on linux 2.6.30 aber wie diese Probleme werden nicht beantwortet und sind ziemlich alt Ich habe versucht, sie hier Neuformulierung mit mehr Erklärungen in der Hoffnung auf eine Antwort.
c sendto Funktionssätze „Netzwerk ist nicht erreichbar“ errno in linux2.6.29

Ich habe einen UDP-Server und einen Client, wo Clients lebende Nachrichten senden und der Server sie abfängt (Code ist wie folgt). Wenn ich diese auf verschiedenen Desktop-Linux wie ubuntu14.04, 16.04, Fedora6 und ... ausführe, funktionieren sie gut. Aber wenn ich versuche, sie von einem ltib Embedded Linux auf einem mpc8308 Board ausgeführt, funktioniert der Server (Empfang von Nachrichten von anderen Maschinen) aber Client setzt errno auf "Netzwerk ist unerreichbar", wie es sendto aufruft.
Ich habe versucht, wireshark und es gibt keine Paket-on-Board-Schnittstellen vom Client und ich testete das System mit tcpdump an Bord und es gibt keine generierten Paket dort. Hier

ist der Code für Client:

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); 
    } 

EDIT:
Ich habe das Senden von Broadcast-Nachrichten Broadcast-IP-Adresse Subnetz und es funktionierte. Aber die globale Broadcast-Adresse ist nicht erreichbar ... Ich denke, das Problem ist, dass os nicht herausfinden kann, welche Netzwerkschnittstelle es für das Senden dieses Pakets verwenden soll, aber ich weiß nicht, wie ich es beheben kann. EDIT2:
ich einige Optionen zu meinen Code hinzugefügt, so dass die Buchse an eine bestimmte Schnittstelle bindet und das Problem, das ich oben erwähnt gelöst werden, und dies gearbeitet:

int rc = setsockopts(clientSocket, SOL_SOCKET, SO_BINDTODEVICE, "eth0", 4); 

Ich lieh diesen Code-Schnipsel aus Bind UDP listening socket to specific interface (or find out the interface a datagram came in from).

+0

Klingt eher nach einem Verwaltungs-/Netzwerkproblem als nach Programmierungszwecken. – Olaf

Antwort

3

Ihr Code ist in Ordnung. Das Problem liegt in Ihrer Netzwerkadministration.

Sie verpassen eine Standardroute. Die Standardroute wird möglicherweise von Ihrem DHCP-Server bereitgestellt, Sie müssen ihn möglicherweise in Ihren Netzwerkkonfigurationsdateien angeben, oder Sie müssen möglicherweise einen Befehl wie route add default gw 192.0.2.1 ausgeben.

+0

Thnx. es funktionierte ... Ich finde auch eine Lösung für das Problem, das von c-Code funktioniert, wie in der 2. Ausgabe in meinem Beitrag erwähnt. – mhk

+0

Aber was, wenn ich auf allen Schnittstellen senden muss? – mhk

Verwandte Themen