に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:ソケットが特定のインターフェイスに結合し、私は上記の問題を解決することができ、これが働いたよう
私は自分のコードにいくつかのオプションを追加しました。
プログラミング関連以外の管理/ネットワークの問題に似ています。 – Olaf