19

私はC++サーバー/.NETクライアントアプリケーションのカップルに取り組んでいます。サーバー(Linux上でc ++を実行)がメッセージをブロードキャストして、ネットワーク全体に生きていることを示し、.NETプログラムがパケットをリッスンして稼働時間を取得するために解析しますサーバーの。

私が読んだように、通常のUDPブロードキャストをブロードキャストアドレスに送信するには、パケットを192.168.0.255(私の場合は192.168.2.255)または255.255.255.255に送信する必要があります。これは正しいですか?同じポートアドレスを使用できますか?他に必需品はありますか?

.NETプログラムがその特定のアドレスをリッスンすると、C++サーバープログラム以外のアプリケーションからパケットを受信できることを理解しています。.NETプログラムがパケットのヘッダーを読み取り、それが(ほぼ)探しているものであることを確認するために、C ++サーバー側でパケットに「署名」する方法はありますか?

4

3 に答える 3

31

使用している言語に関係なく、これが私の答えです。

ブロードキャストIPアドレスに関しては、両方のアドレスがブロードキャストアドレスですが、制限されたブロードキャストアドレス(255.255.255.255)はルーターによって転送されません。サブネット向けのブロードキャストアドレス(192.168.2.255)を使用することをお勧めします。

ブロードキャストアドレスを送受信するには、ブロードキャストアドレス(ブロードキャストIPアドレスとポート番号)を定義する必要があります。例:192.168.2.255およびポート番号3000。クライアントアプリケーション(送信者)は、次のようにSO_BROADCASTソケットオプションを有効にする必要があります。

int enabled = 1;
setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &enabled, sizeof(enabled));

ここで、sockfdはソケット記述子です。

サーバーアプリケーションは特定のポート番号(ポート3000)でリッスンします。通常、サーバーはユニキャストメッセージを使用して各要求に応答します。

同じポート番号でリッスンしているアプリケーションがない限り、競合は発生しません。SO_REUSEADDRESSソケットオプションを有効にしない限り、別のアプリケーションが同じポートでリッスンしている場合、サーバーは実行されません。ただし、競合がある場合、署名はプロトコル(メッセージ形式)によって異なります。したがって、メッセージ形式を確認し、アプリケーションプロトコルで定義されたメッセージ形式に準拠していない場合はメッセージを拒否します。

クライアントアプリケーションの場合、受信したパケットはユニキャストです(別の設計がない場合)。したがって、こちら側での競合はありません。

于 2011-06-16T16:01:15.033 に答える
9

また、ブロードキャストトラフィックを送信するには、C ++でSO_BROADCASTソケットオプションを有効にする必要があります。そうしないと、アクセス許可が拒否されたというエラーが発生します。

int broadcastPermission = 1;
setsockopt(socketDescriptor, SOL_SOCKET, SO_BROADCAST, (void*)&broadcastPermission, sizeof(broadcastPermission))
于 2011-06-16T15:46:33.890 に答える
3

.NETプログラムがブロードキャストトラフィックをリッスンする場合、サーバーから送信されていないトラフィックを含め、そのポートで送信されたネットワーク上のすべてのブロードキャストトラフィックを受信します。サーバーから送信されるブロードキャストメッセージのペイロードに「マーカー」を配置できます。このようにして、.NETプログラムは気になるものを区別できます。

それ以上に、ブロードキャストの代わりにマルチキャストを使用することをお勧めします。ブロードキャストトラフィックは通常、同じサブネット上のホストに制限されます。簡単に言うと、ネットワークにルーターがある場合、ルーターが「ブロック」するため、ルーターのサイドAのホストはサイドBのホストから送信されたブロードキャストトラフィックを認識しません(その逆も同様です)。ホストがマルチキャストグループに参加している場合、ルーターはほとんどの場合マルチキャストトラフィックを転送します。

于 2011-06-16T15:27:28.143 に答える