2016-07-26 12 views
2

にerrnoに私は sendto function setting "network is unreachable" errno と同様の問題を抱えているし、(以下同様)UDP Broadcast sendto failed:“network is unreachable” on linux 2.6.30が、この問題が答えて、私はここでそれらを修正再表示しようとしたかなり古いですされていないとして、答えが得られることをもっと明確にしています。
Cのsendto機能セット「ネットワーク到達不能である」linux2.6.29

私は、クライアントが生存メッセージをブロードキャストし、サーバがそれらをキャッチしている(コードは以下の通りです)。私はubuntu14.04、16.04、fedora6などのいくつかの異なるデスクトップLinuxでこれらを実行すると...うまく動作します。しかし、私がmpc8308ボード上に埋め込まれたlinuxからltibを実行しようとすると、サーバは動作し(他のマシンからメッセージを受け取る)、クライアントはsendtoを呼び出すとerrnoを "network is unreachable"に設定します。
私は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); 
    } 

EDIT:ここ

は、クライアントのためのコードである
私はブロードキャストIPアドレスをサブネットにブロードキャストメッセージを送信するにチェックし、それが働きました。しかし、グローバルなブロードキャストアドレスに到達することはできません...私は問題は、OSはこのパケットを送信するために使用する必要がどのネットワークインターフェイスを識別することはできませんが、私はそれを修正する方法を知らないと思う。

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)から、このコードスニペットを借り: EDIT2:ソケットが特定のインターフェイスに結合し、私は上記の問題を解決することができ、これが働いたよう
私は自分のコードにいくつかのオプションを追加しました。

+0

プログラミング関連以外の管理/ネットワークの問題に似ています。 – Olaf

答えて

3

コードは問題ありません。問題はネットワーク管理にあります。

デフォルトルートがありません。デフォルトのルートはDHCPサーバーによって提供されている可能性があります。ネットワーク設定ファイルで指定する必要がある場合や、route add default gw 192.0.2.1などのコマンドを発行する必要があります。

+0

Thnx。それは働いた...私はまた、私のポストで2番目の編集で述べたように、Cコードから動作する問題の解決策を見つける。 – mhk

+0

しかし、すべてのインターフェイスでブロードキャストする必要がある場合はどうすればいいですか? – mhk

関連する問題