Windowsネットワークプログラミングの専門家に質問。Windows:TCP/IP:強制的に接続を強制:カーネル/ユーザーレベルでmemleakを避ける
私はこのような擬似コードを使用する場合:
reconnect:
s = socket(...);
// more code...
read_reply:
recv(...);
// merge received data
if(high_level_protocol_error) {
// whoops, there was a deviation from protocol, like overflow
// need to reset connection and discard data right now!
closesocket(s);
goto reconnect;
}
は、カーネルの非準を行い、待っている、カーネルメモリに、それは本当に既に存在でなければならないので、「物理的」NIC(から受信したすべてのデータを解放します私はclosesocket()を呼び出すと、ユーザーレベルでrecv()を使って読むことができますか?データは内部オブジェクトに関連付けられていないため、論理的にはそうでしょうか?
「」のようなクリーンシャットダウンの時間が分からないので、recv()が返されるまでエラーはになるため、それは意味をなさない:何かがエラーを返すことは決してないと言うと、サーバーはデータを永遠に送信し続け、接続を閉じないが、それは悪い振る舞いであるか?
私のアプリケーションがメモリリークをどこにでも引き起こしたくないので、私はそれについて疑問に思います。このように強制的に接続をリセットする方法ですが、それでもまだが送信されると予想されますデータ量は正しいですか?
//このオプションがWindowsに適していると思われる場合は、UNIX対応OSの場合(closesocket()
〜close()
の変更あり)は正しいと考えることができますか?