4

私のUniの割り当てでは、高速アクションペースのネットワークゲームを作成する必要があるため、TCPではなくUDPを使用することを選択しました。私はUDPとTCPの両方のプログラミングにおける多くの違いを認識しており、winsockに関するMSDNのドキュメントの関連部分のほとんどを読み通しました。MSDNでは、connect()関数を介してUDPソケットを作成すると、指定されたアドレスとポートにソケットがバインドされ、その結果、作成されたソケットでsend()関数とrecv()関数を使用できるようになると記載されています。

私のアプリケーションでは、クライアントを作成し、send()関数を介して多数のパケットを送信するループバックアドレスを使用してconnect()を使用します。クライアントは、select()を呼び出した後、送信したパケットを受信します。ただし、recv()関数から取得した結果はSOCKET_ERRORであり、WSAGetLastError()を使用したエラーの説明は「既存の接続がリモートホストによって強制的に閉じられました」です。

bind()関数を使用し、sendto()を使用してループバックアドレスを介してデータを送信すると、エラーなしでパケットをrecv()します... connect()関数が想定どおりに動作しない理由を誰かが知っていますか、そして誰もがconnect()関数でUDPソケットを使用できましたか?

4

4 に答える 4

18

プログラムでUDPパケットを受信する場合は、bind()を呼び出す必要があります。connect()は、send()を呼び出した場合にソケットがパケットを送信するアドレスのみを設定します。ソケットをローカルUDPポートに関連付けて受信することはありません。そのためには、bind()を呼び出す必要があります。

于 2010-12-20T05:08:45.197 に答える
4

「UNIXネットワークプログラミング」は、UDPクライアント側のソケットで行われる接続呼び出しが宛先ソケットアドレスに関するすべての状態(マスキング、インターフェイスの選択など)を事前に把握して保存し、すべての場合にそうするコストを節約することを指摘しています::sendto呼び出し。この本は、このオーバーヘッドの削減により、::sendと::sendtoの速度が最大3倍になると主張しています。データはほとんどのIPスタック処理をバイパスしてNICドライバーに直接送られます。高性能ゲームプログラマーはこれを検討したいかもしれません。

于 2016-06-25T17:04:24.433 に答える
1

Beejのインターネットソケットを使用したネットワークプログラミングガイドを確認する必要があります。質問に対処する良い例があります。

于 2010-12-20T05:22:10.180 に答える
-3

UDPプロトコルは「コネクションレス」プロトコルであることに注意してください。つまり、ホストに接続することはなく、データを送信するだけです。したがって、アクションとしての接続はUDPにとって無意味であることがわかります。

UDPの場合、これらの関数でsendto()とrecvfrom()を使用して、アドレスとバッファーを指定する必要があります。これで、TCPで快適に処理できるものはすべてなくなり、自分で処理する必要があります。

MSDNのドキュメントには、実際にはUDPで通常のsend / recv関数を使用できると記載されていますが、すでに個別の関数があるのに、なぜそうするのでしょうか。他のコメントのように、UDP用のconnect()は、本質的に「接続」操作ではなく、UDP用にsend()/ recv()を設定するための一種のフィルターです。

于 2013-10-14T20:25:04.593 に答える