ソケット サーバーに大量のパケットを送信すると、それらは内部の受信ソケット バッファーに収集されます。
送信元を停止し、サーバーを再起動すると、以前に送信されたパケットが 1 つずつ消費されます。
どうにかして内部ソケット バッファをリセットすることは可能ですか。
私は UDP ソケットを使用しており、コードは Windows 上の C++ で作成されています。
あなたの質問は明確ではありません。ソケットを閉じて新しいソケットを作成すると、古い保留中のデータを含む古いソケットからの古いソケット バッファではなく、何もない新しいソケット受信バッファが取得されます。ただし、新しいソケットをバインドした時点でまだパケットが転送中である可能性があるため、パケットは到着するとすぐに新しい受信バッファーに表示されます。それについてあなたができることは何もありません、そしてあなたがすべきことは何もありません、それは正しいです.
残念ながら、UDP には「接続」の概念がないため、OS (またはユーザー) が「古い」データと「新しい」データを区別する方法はありません。
特に Win32 では、にSIO_FLUSH
渡すことができる ioctl がありますWSAIoctl()
。私はこれを試していませんが、送信キューにのみ関連しているようです。
アプリケーションに問題があるか、アプリケーションに間違ったプロトコル (この場合は UDP) を選択したかのいずれかです。
UDP は、メッセージの順序や配信を保証しません。したがって、同じポートでサーバーを再起動すると、古いデータが読み取られるのは当然です。
SO_LINGERオプションを0に設定し、SO_REUSEADDRESSを設定してTIME_WAIT状態を回避することで、TCPを使用してこれを回避できたと思います。