私は単純なマルチキャスト アプリケーションを作成しています。私はローカルホストで実行するつもりです。
私は次のことをしました:
char *maddr;
.
.
.
sendfd = socket(...);
struct sockaddr_in sasend;
sasend.sin_family = AF_INET;
sasend.sin_port = htonl(portno);
inet_ntop(maddr, &(sasend.sin_addr.s_addr));
struct sockaddr_in sarecv;
memcpy(&sarecv, &sasend);
recvfd = socket(...);
const int on = 1;
setsockopt(recvfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); // can you explain why
// this is needed
bind(recvfd, &sarecv);
struct ip_mreq mreq;
memcpy(&mreq.imr_multiaddr, &(sasend.sin_addr));
mreq.imr_interface = htonl(INADDR_ANY);
setsockopt(recvfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq));
char flag = 1;
setsockopt(sendfd, IPPROTO_IP, IP_MULTICAST_LOOP, &flag, 1);
if (fork() == 0) {
while (recvfrom(recvfd)) {
}
}
else {
while (sendto(sendfd)) {
sleep(3);
}
}
実際のコードでは、すべてのシステム コールの戻り値をチェックしています。問題は、recvfrom が戻らないことです。プロセスは、recvfrom の呼び出しでブロックされたままになります。
異なるシェルでプログラムの 2 つのインスタンスを実行しようとしました。それは役に立ちません。
また、ループバック フラグを 0 に設定しようとしましたが、役に立ちません。
両方のプログラムを localhost から実行したい。
私が使用しているマルチキャスト アドレスは、本から見た 239.255.1.2 です。必要な setsockopt 呼び出しを行っているため、任意のクラス D アドレスを使用できると思います。
ポート 1025 で接続中
Linuxカーネル2.6.25を実行しています
また、マルチキャスト サポートがカーネルにコンパイルされているかどうかを確認する方法も教えてください。
更新:
シェルで route add -net 224.0.0.0 netmask 240.0.0.0 dev eth0 を実行しました。それでも問題は存在します。