質問

私のUNIの割り当てでは、Fast Action Paced Networkedゲームを作成する必要があるため、TCPではなくUDPを使用することを選択しました。私は、UDPとTCPの両方のプログラミングの違いの多くを知っており、Winsockに関するMSDNのドキュメントの関連する部分のほとんどを読んでいます。 MSDNでは、Connect()関数を介してUDPソケットを作成すると、ソケットを指定したアドレスとポートにバインドし、その結果、作成されたソケットでsend()およびrecv()関数を使用できることが示されています。

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

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

役に立ちましたか?

解決

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

他のヒント

「UNIXネットワークプログラミング」は、UDPクライアントサイドソケットで行われた接続コールが、事前に宛先ソケットアドレス(マスキング、インターフェイスの選択など)に関するすべての州にすべての州を保存し、すべてのコストを節約することを指摘しています。 :: sendto call。この本は、:: send vs :: sendtoを主張していると主張しています 最大3倍 このオーバーヘッドが減少したため、より速く、データはほとんどのIPスタック処理をバイパスするNICドライバーに直接移動できます。高性能ゲームプログラマーは、これを検討したいと思うかもしれません。

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

UDPプロトコルは「コネクションレス「プロトコルは、ホストに接続することは決してないという意味で、データを送信するだけです。そのため、アクションがUDPにとって無意味であるため、接続は確認できます。

UDPの場合、sendto()およびrecvfrom()を使用する必要があります。これらの関数では、アドレスとバッファーを指定します。

MSDNのドキュメントでは、実際にはUDPを使用して通常の送信/RECV関数を使用できることに言及していますが、すでに個別の関数を持っているのに、なぜあなたはなぜですか? udp for udpの既にconnect()がコメントしたように、他の何かを行います。本質的には「接続」操作ではなく、udp使用のためにsend()/recv()をセットアップするためのフィルターのようなものです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top