9

この質問はhttps://stackoverflow.com/questions/11650328/using-reliable-multicast-pragmatic-general-multicast-not-returning-from-acceptに似ていますが、私のコードはそれとは少し異なるため、結果として生じる可能性があります別の答えで。

信頼できるマルチキャスト サーバー/クライアントの概念実証のセットアップを取得しようとしています。

ソリューション自体はサーバー/クライアント接続です。クライアントは、TCP/IP 経由でサーバーに接続します。次にサーバーは、クライアントがリッスンするための信頼できるマルチキャスト ソケットを開きます。クライアントは TCP 経由でメッセージを送信し、サーバーはそれを 経由でエコー バックしIPPROTO_RMます。最終的な目標は、多数のクライアントをサーバーに接続し、すべてのクライアントがすべてのエコー メッセージを受信するようにすることです。

サンプル コードはこのページに基づいています。

同様に RM ソケットをセットアップしました (以下のリストを参照)。TCP ソケットは正常に動作しています。問題は RM ソケットにあります。サーバーはマルチキャスト ソケットを開きbindsconnectsマルチキャスト アドレスに適切に接続します。ただし、クライアントは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;
4

1 に答える 1

1

MSMQ(マイクロソフトメッセージキューイング)がインストールされていますか?IPPROTO_RMがMsベースのコンピューターで動作するために必要です。さらに、Windowsバージョン> = Xp||2003でのみ機能します

編集:あなたはすでにそれをチェックしているのを見ました。

于 2013-03-20T09:14:35.467 に答える