この質問はhttps://stackoverflow.com/questions/11650328/using-reliable-multicast-pragmatic-general-multicast-not-returning-from-acceptに似ていますが、私のコードはそれとは少し異なるため、結果として生じる可能性があります別の答えで。
信頼できるマルチキャスト サーバー/クライアントの概念実証のセットアップを取得しようとしています。
ソリューション自体はサーバー/クライアント接続です。クライアントは、TCP/IP 経由でサーバーに接続します。次にサーバーは、クライアントがリッスンするための信頼できるマルチキャスト ソケットを開きます。クライアントは TCP 経由でメッセージを送信し、サーバーはそれを 経由でエコー バックしIPPROTO_RM
ます。最終的な目標は、多数のクライアントをサーバーに接続し、すべてのクライアントがすべてのエコー メッセージを受信するようにすることです。
サンプル コードはこのページに基づいています。
同様に RM ソケットをセットアップしました (以下のリストを参照)。TCP ソケットは正常に動作しています。問題は RM ソケットにあります。サーバーはマルチキャスト ソケットを開きbinds
、connects
マルチキャスト アドレスに適切に接続します。ただし、クライアントはlistens
正しく、呼び出しはaccept
永久にブロックされます。
クライアント プロセスとサーバー プロセスの両方が同じホスト上で実行されています。
確認したところ、マルチキャスト サポートがホスト (Server 2008) にインストールされています。
更新:最初に送信者側からソケットにデータを送信すると、acceptが返される場合があることに気付きました。これは理想的ではなく、信頼性もありません。
更新: 標識はスイッチを指しています。小さなハブではうまくいかないようです。建物全体の通信が途絶えるという愉快な事件がありました。
リスト
サーバーはマルチキャスト送信者を作成して接続します
short
Port = 0;
const char
*Address = "234.5.6.7";
SOCKET
RMSocket;
SOCKADDR_IN
LocalAddr,
SessionAddr;
RMSocket = socket(AF_INET, SOCK_RDM, IPPROTO_RM);
if (RMSocket == INVALID_SOCKET)
{
return Failed;
}
LocalAddr.sin_family = AF_INET;
LocalAddr.sin_port = htons(0);
LocalAddr.sin_addr.s_addr = htonl(INADDR_ANY);
if ( bind( RMSocket, (SOCKADDR*)&LocalAddr, sizeof(LocalAddr)) == SOCKET_ERROR )
{
return Failed;
}
SessionAddr.sin_family = AF_INET;
SessionAddr.sin_port = htons( Port );
SessionAddr.sin_addr.s_addr = inet_addr( Address );
if ( connect( RMSocket, (SOCKADDR*)&SessionAddr, sizeof(SessionAddr)) == SOCKET_ERROR )
{
return Failed;
}
return Success;
クライアントがマルチキャスト リーダーを作成して受け入れる
short
Port = 0;
const char
*Address = "234.5.6.7";
SOCKADDR_IN
LocalAddr;
SOCKET
RMListener,
RMSocket;
RMListener = socket( AF_INET, SOCK_RDM, IPPROTO_RM );
if ( RMListener == INVALID_SOCKET )
{
return Failed;
}
LocalAddr.sin_family = AF_INET;
LocalAddr.sin_port = htons( Port );
LocalAddr.sin_addr.s_addr = inet_addr( Address );
if ( bind( RMListener, (SOCKADDR*)&LocalAddr, sizeof(LocalAddr) ) )
{
return Failed;
}
if ( listen( RMListener, SOMAXCONN ) )
{
return Failed;
}
// BLOCKS HERE
RMSocket = accept( RMListener, NULL, NULL);
if ( RMSocket == INVALID_SOCKET )
{
return Failed;
}
return Success;