2014年9月3日水曜日

ブロードキャスト送信

UDPでブロードキャスト送信する必要があったので久しぶりにコードを書いたのですが、
なぜかうまく送信できません。
使ったコードは以下のような感じです。
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

int main(void)
{
 int s;
 struct sockaddr_in dst,src;
 int y=1;
 char buff[10]="0123456789";

 memset(&src,0,sizeof(src));
 src.sin_family=AF_INET;
 src.sin_port=htons(1046);
 memset(&dst,0,sizeof(dst));
 dst.sin_family=AF_INET;
        dst.sin_addr.s_addr=inet_addr("255.255.255.255");
 dst.sin_port=htons(1046);
 s=socket(AF_INET,SOCK_DGRAM,0);
 setsockopt(s,SOL_SOCKET,SO_BROADCAST,(char*)&y,sizeof(y));
 bind(s,(struct sockaddr*)&src,sizeof(src));
 sendto(s,buff,sizeof(buff),0,(struct sockaddr*)&dst,sizeof(dst));
 close(s);
}
別におかしくありません。
ためしに別のPCで実行してみたところちゃんと送信できます。
で、よくよく調べてみると、動かなかったPCにはNICが2つついていたんですね…orz
この場合どちらのインターフェイスから送信するかを指定してやらないと、
あらぬ方向にパケットが飛び出します。
src.sin_addr.s_addr=inet_addr("<送信したいNICに割り当てられたIPアドレス>");
を入れてやると想定どおりの動作となりました。やれやれ。

そういえば前にも似たような体験をしたことがあります。相変わらず学習できてないですね。
まあでも、ここに書いておけばまた同じようなことになってもきっと思い出せるでしょう。

0 件のコメント:

コメントを投稿