これはWindows7のC++にあります...私は一種の初心者のマルチキャストソケットの人であり、このコードを他の誰かから継承しました。
このシステムでは、複数のコンピューターがADDR 225.1.1.2でマルチキャストソケットを作成/参加し(なぜそうではないのか)、ソケットが接続されると、定期的に相互に「チャット」してさまざまなメッセージを送信します。ネットワーク上で1台のコンピューター(「A」と呼びます)を起動し、1秒に1回定期的に「キープアライブ」メッセージを送信させても、何も受信されていない(マルチキャストアドレスに接続している他のユーザーがいない)場合は、そのままにしておきます。約3分間、次に別のコンピューターBを起動すると、最初のコンピューターAはコンピューターBからのブロードキャストメッセージを認識しません。Bはパケットの送信でエラーを取得しておらず、Aは何も受信してエラーを発生していません(受信が呼び出されることはありません)。何かが受信部分をシャットダウンしている場合に通知を受け取る方法、またはそのような情報を登録する方法がわかりません。
2台のマシンを比較的近くで起動すると、各マシンは他のマシンのキープアライブパケットを認識します。受信は両方のマシンで発生します。しかし、繰り返しになりますが、最初のコンピューターを起動してから3分を超えて、2番目のコンピューターを起動すると、最初のコンピューターのReceiveメソッドがスリープ状態になったか、なくなったか、昏睡状態になっているようです。エラーは生成されませんが、プレーンにはマシンBのパケットは表示されません。(さらに、デバッガーの出力に3つのスレッドが存在しますが、それらは私が作成したスレッドではなく、システムスレッドです)。ただし、最近起動したマシンBは、マシンAからのキープアライブパケットを確認します。
ソケット呼び出しは次のとおりです。
hSock = WSASocket(
AF_INET,
SOCK_DGRAM,
0,
NULL,
0,
WSA_FLAG_MULTIPOINT_C_LEAF | WSA_FLAG_MULTIPOINT_D_LEAF | WSA_FLAG_OVERLAPPED);
setsockopt(hSock,SOL_SOCKET,SO_REUSEADDR,(char *) &bVal,sizeof(bVal));
srcIP.sin_family=AF_INET;
// Need to bind to local interface
srcIP.sin_addr.s_addr=inet_addr(("225.1.1.2"); // htonl(INADDR_ANY);
srcIP.sin_port=htons(5555);
bind( hSock,(struct sockaddr FAR *) &srcIP,sizeof(srcIP) );
nIP_TTL=36;
setsockopt(hSock,IPPROTO_IP,IP_MULTICAST_TTL,(char *) &nIP_TTL,sizeof(int));
mreq.imr_multiaddr.s_addr=inet_addr("225.1.1.2");
mreq.imr_interface.s_addr=inet_addr("225.1.1.2");
setsockopt(hSock,IPPROTO_IP,IP_ADD_MEMBERSHIP,(char *) &mreq,sizeof(mreq));
これが私がインターネットで出くわしたものです:
- 受信バッファがいっぱいになっている可能性があります。(マルチキャストを使用しているネットワーク上にあるのはコンピューターAだけなので、そうは思いません)
- ファイアウォールは、数分後に受信オンマルチキャストをオフにするように設定できます。(私はこれを信じていません)
- WinSockプロトコルは、X分間非アクティブになった後、マルチキャストの受信をオフにする可能性があります。(私もこれを信じていません)