2

アプリケーションを書いていますが、ポイントがわかりません。特定のクライアントからデータを受信しようとしています。TCP ソケットでは、accept は番号を返すfdので、このfd番号を介して特定のクライアントと通信できます。

ではrecvfrom、そのクライアントからデータを受信するように指定することはできません。送信したすべての人からデータを受信します。これを解決しようとしていますが、これを行う方法がわかりません。

2 つ目の問題は、ソケットを開いた後で別のソケットを開くことです。クライアントに 2 番目のソケット番号を送信すると、クライアントはこの 2 番目のソケットで 2 番目のデータを送信します。サーバー側では、サーバーは (2 番目のソケットではなく) 最初のソケットをリッスンします。ただし、クライアントは 2 番目のソケットからデータを送信し、サーバーは最初のソケットをリッスンしますが、サーバーはデータを取得します。2 つのソケットを整数として出力すると、2 つが異なることがわかります。サーバーは、最初のソケットの 2 番目のソケットで送信されたデータをどのように読み取ることができますか?


ええ、私の質問は少し複雑です。基本的に私は言います:

recvfrom(sock, &client, sizeof(Client), MSG_WAITALL, (struct sockaddr *)&clientAddr2, &size);

上記の行で、特定のクライアント (クライアント 2 など) にリッスンするように指示するにはどうすればよいでしょうか? (TCP ソケットではfd番号で行われますが、UDP ソケットではどうですか?)

4

3 に答える 3

2

Accept は udp では使用されません。socket を呼び出し、bind を呼び出してポートを確立し、sendto と recvfrom を呼び出します。

あなたの説明にうまく従うことができないのではないかと心配していますが、これが役に立てば幸いです。

TCP と UDP は別個のものであり、互換性のないプロトコルです。UDP クライアントとサーバーは相互に通信し、TCP クライアントとサーバーは相互に通信します。仮説としては、RAW ソケットを使用して相手側の TCP と通信できますが、TCP プロトコルを完全に実装する必要があります。

UDP には接続がありません。さまざまなクライアントの概念がある場合は、パケット内に配置したデータでそれらを分類する必要があります。

于 2010-11-17T23:05:04.130 に答える
1

あなたが探しているものを理解できれば、サーバー上の各ソケットを異なるポート番号にバインドする必要があります。次に、クライアントは目的のポートに送信する必要があります。

ただし、そうする必要はないかもしれません。サーバーは、recvfrom() 呼び出しを介して提供されたアドレスを調べ、それを適切なクライアントに関連付け、どのクライアントがそれを送信したかに応じて (たとえば、ワーカー スレッドを介して) 処理することができます。

于 2010-11-17T23:23:39.427 に答える
0

UDP を使用して TCP と通信することはできないと思います。UDP は TCP のスーパー セットではありません。これらは、同じ層の 2 つの異なるプロトコルです。詳細については、このページを試してください

コンピュータの同じポートに対して 2 つのソケットを開くと、両方のソケットがデータを受信する保証はありません。実際、私の経験では、最初のソケットのみがそうです。

于 2010-11-17T23:20:06.310 に答える