私はUDP通信を起動しています。 シンプルなストライプ・ダウン・バージョンでは、クライアントは基本的に次のようにしています。(はい、多くのifとエラー・チェックがコード内にあり、いいえ、多くの定義はそのままでは機能しません。ここでは、実際のコードよりもconseptual)UDPとソケットがクライアントに応答しています
sock = socket(AF_INET, SOCK_DGRAM, 0);
server_length = sizeof(struct sockaddr_in);
sendto(sock, "Hi", 3, 0, (struct sockaddr *)&myaddr, server_length);
numRes = recvfrom(sock, (char *)buff, (int)sizeof(buff), 0, (struct sockaddr *)&myaddr, &server_length);
とサーバは、基本的には同じです:
sock=socket(AF_INET, SOCK_DGRAM, 0);
bind(sock,(struct sockaddr *)&server,length);
resBytes=recvfrom(sock,buff,(int)sizeof(buff),0,(struct sockaddr *)&from, &fromlen);
sendto(sock, "Test",5, 0, (struct sockaddr *)&from, fromlen);
これは動作します。両端は、相手側が送信するデータを受信します。
ここに私の問題があります:サーバーは、同時に多くの要求を処理する必要があります。メッセージのキューを作って、別のスレッドがそれを処理できるようにしてから、別のスレッドのクライアントに送り返します。私がこれを行うと、送信用の新しいソケットが作成され、メッセージの後に続く「送信元」と同じアドレスが使用されましたが、クライアントは受信しません。
UDPメッセージでの返信は、同じソケットで行う必要があることを理解していますか?
同じソケットを送受信に使用すると、3つのクライアントでメッセージを送信するとどうなりますか?処理が完了すると、ランダムな順序で応答します。これは使えますか?
私はクライアント上で "サーバー"を作ることができますが、私の推測では、どんなNATでもそのアイデアを速く打ち破ることができます。私が試みることを試みる何
は、多かれ少なかれ、この次のとおりです。この種のコードが動作する必要がある場合は
sock=socket(AF_INET, SOCK_DGRAM, 0);
sock2=socket(AF_INET, SOCK_DGRAM, 0);
bind(sock,(struct sockaddr *)&server,length);
resBytes=recvfrom(sock,buff,(int)sizeof(buff),0,(struct sockaddr *)&from, &fromlen);
sendto(sock2, "Test",5, 0, (struct sockaddr *)&from, fromlen);
、私は戻って私のデバッグになりますが、これは当てはまらないように、今、それはそうです。
編集: 誰かがタグとして「マルチスレッド」を追加しました。マルチスレッドのことを忘れているなぜ私は同じ要求に迅速に応答しないのかを説明する。何かが必要な場合は、すべての通信を1つのスレッドで行うことができます。申し訳ありませんが、これは人々を混乱させるが、ここでの主な質問は次のとおりです。a)クライアント上に「サーバー」を定義することなく、別のサーバーに応答を送信できますか? b)そうでなければ、同じソックされた(IEクライアントA送信、クライアントB送信、クライアントB応答、クライアントA応答、クライアントA応答)のランダムな順番をどのように処理するでしょうか?
ソケットは、複数のスレッドで共有することはできません。しかし、UDPはコネクションレスなプロトコルなので、別のソケットを使って送受信できます。 – user0042
@ user0042: "*ソケットは複数のスレッドで共有することはできません。それはアクセスがどのように同期するかの問題です。 – alk
@alkまあ、同期は別々のスレッドを使う目的を打ち負かしますか? – user0042