1

複数のソケットをバインドしようとすると、コードに問題が見つかりました。状況を説明しようとすると、2 つの部分で構成されるアプリケーションがあります。1 つは machine_1 で実行される C で記述され、もう 1 つは machine_2 で実行される Java で記述されています。C プログラムは、1 つのポートを介して、リッスンしている machine_2 の 4 つのポートに udp パケットを送信できる必要があります。逆に、machina_2 は、1 つの発信ポートを介して、machine_1 の 4 つの対応するポートに udp パケットを送信する必要があります。

問題は machine_1 にあります。

  1. そこには 2 つのスレッドがあり、1 つは machine_2 への送信データを処理し、もう 1 つは受信データを処理しています。最初のスレッド (送信データの処理) 内で、4 つのソケット (4 つの異なるポートを持つ) を作成して、machine_2 の対応するソケットに対処します。その方向でうまく動作します...
  2. しかし、machine_2 からの着信データ用のソケットを作成しようとすると、machine_2 の着信データに使用したのと同じポート番号を使用したいのですが、ソケットをバインドしようとすると問題が発生します。: Address already in use私にエラーを与えます。

送信ポートと受信ポート用に C アプリケーション内で machine_1 のソケット構成をセットアップする方法について、助けが必要です。select()そして、関数を使用して 4 つの着信ソケットすべてをリッスンする方法の例かもしれません。

コード例が必要な場合は、ここに追加できますが、先ほど述べたように、これは、1 つのソケットから machine_2 の 4 つの異なるソケットへの送信データを処理する thread_1 に対してのみ機能します。

よろしくお願いします。

添付の写真が状況をもう少し説明できることを願っています。重要なのは、受信データに両方のマシンで同じポート番号を使用したいということです。つまり、machine_1 の port_1 は machine_2 の port_1 と同じポート番号を持ちます。ポート構成

4

2 に答える 2

3

送信用に 1 つのソケットを作成し、次に受信用に 4 つのソケットを作成し、受信ソケットを正しいローカル ポートにバインドします。発信ソケットで sendto を使用して、受信者に内容を送信します。

select の怠惰な例 (おそらくバグがありますが、一般的な考え方は理解できるはずです):

fd_set fds;
int nfds = /* max(in_1, in_2, in_3, in_4) + 1 */;
while(1) {
    int ret = 0;
    FD_ZERO(&fds);
    FD_SET(in_1, &fds);
    FD_SET(in_2, &fds);
    FD_SET(in_3, &fds);
    FD_SET(in_4, &fds);
    ret = select(nfds, &fds, NULL, NULL, NULL);
    if(ret < 0) {
        break; /* something went wrong */
    } else if(ret == 0) {
        continue; /* nothing to do, try again */
    }
    if(FD_ISSET(in_1, &fds)) {
        handle_in_1();
    }
    if(FD_ISSET(in_2, &fds)) {
        handle_in_2();
    }
    /* ... */
}
于 2012-05-16T07:55:07.903 に答える
1

私のアドバイスは、4つのソケットを使用することです。ソケットは双方向です (つまり、本当に 4 つのソケットが必要な場合、これは UDP であるため、おそらく 1 つのソケットで十分です)。次に、複数のスレッド間でソケットを共有し、それらに対して読み取りまたは書き込みを行うことができます。同期する必要があるものはすべて同期する必要があります。

select の使用方法の例を次に示します。

http://www.lowtek.com/sockets/select.html

于 2012-05-16T07:55:38.587 に答える