1

未送信のデータがあるUDPソケットをすぐに閉じる必要があります。TCPソケットにはSO_LINGERパラメーターがありますが、UDPには何も見つかりませんでした。Windows上にあります。

前もって感謝します。

更新0:

この質問の背景を説明します。アプリケーションの1番目のスレッドがソケットを開く/バインドする/閉じる、2番目のスレッドがそれにデータグラムを送信します。場合によっては、ソケットを閉じた後(エラーコード= 0)、バインド関数はエラーコード10048「アドレスはすでに使用されています」を返します。close()実行ポートがまだ使用されていることを知りました(netstatコマンドを使用)。たぶん私は間違った質問をします、そしてそのような行動の理由は何か他のものですか?

4

3 に答える 3

1

返品後のすべてのアプリケーションの目的send()で、パケットは「送信」されます。TCPのような送信バッファはなく、NICパケットキューを制御することはできません。必要なのは通常close()だけです。

編集0:

@EJP、これがUNPからの引用です(セクション2.11「UDP出力」):

今回は、ソケット送信バッファーが実際には存在しないため、破線のボックスで示しています。UDPソケットには送信バッファサイズがあります( SO_SNDBUFソケットオプションのセクション7.5で変更できます)が、これは単にソケットに書き込むことができる最大サイズのUDPデータグラムの上限です。アプリケーションがソケット送信バッファサイズよりも大きいデータグラムを書き込む場合は、EMSGSIZEが返されます。UDPは信頼性が低いため、アプリケーションのデータのコピーを保持する必要はなく、実際の送信バッファーも必要ありません。(アプリケーションデータは通常、プロトコルスタックを通過するときに、何らかの形式のカーネルバッファーにコピーされますが、このコピーは、データが送信された後、データリンク層によって破棄されます。)

これは私の答えで私が意味したことです-あなたは送信バッファを制御できません-したがって、「すべてのアプリケーションの目的のために」それは存在しません。

于 2012-07-24T16:23:59.870 に答える
0

閉じてください。TCPとは異なり、UDPには保留中のデータが送信されることを示すものは何もありません。

于 2012-07-25T07:28:16.610 に答える
0

WindowsUDPソケットでもこの問題が発生していました。何時間も試した後、最終的に問題が見つかったのはsocket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)、ソケットを作成するためにメインスレッドを呼び出し、ワーカースレッドを呼び出しbind(...)recvfrom()ワーカースレッドを閉じた後closesocket(...)、メインスレッドを呼び出していたということです。どの関数もエラーを返しませんでしたが、何らかの理由で、UDPアドレスとポートの組み合わせが使用されたままになります(したがって、bind()を今後呼び出すと、エラー10048 WSAEADDRINUSEがトリガーnetstat -abot -p UDPされ、アプリケーション全体が閉じられるまでポートがまだ使用中であることが示されます) )。解決策は、ワーカースレッドに移動socket(...)して呼び出すことでした。closesocket(...)

上記のような奇妙な問題を除いて、通常、UDPサーバーソケットを呼び出しclosesocket()た後に開いたままにする方法はありません。 Microsoftは、UDPソケットで維持される接続はなく、呼び出すshutdown()必要も他の関数も必要ないと説明しています。通常、TCPソケットが呼び出し後に開いたままになる理由は、TCPソケットがclosesocket()正常に切断されておらず、TCP_WAIT状態で約4分間待機してから、実際に閉じる前に追加のデータが入る可能性があるためです。上記の場合、netstatは、30分以上待っても、アプリケーションが閉じられるまでUDPソケットが閉じられないことを示しました。

.NET Frameworkのようなwinsockのラッパーを使用している場合は、非同期コールバックを設定すると、コールバックを正しくクリーンアップしないとUDPソケットが開いたままになる可能性があるなど、いくつかの機能も読みましたが、私はしませんそれを引き起こす可能性のあるwin32winsockAPIにそのような機能があると思います。

于 2014-09-30T20:41:49.267 に答える