私は非同期I/Oを利用するために、完了ポートを使ってWindows NTにTCPサーバを作成しています。私は、I/O操作が完了したときに呼び出すTcpSocketクラス、TcpServerクラス、およびいくつかの(仮想関数)コールバックを持っています。読み込みが完了したときのonRead()。私は接続が確立されたときのonOpen()と接続が閉じられたときのonEof()なども持っています。 私はいつもソケットの読み込みを保留しています。ソケットが効果的にデータを取得すると(読み込みはサイズ> 0で完了します)、クライアントがクライアント側からソケットを閉じたときにonRead()を呼び出します。 readはsize == 0で完了します)、onEof()が呼び出され、クライアントはclosesocket(server_socket)でソケットを閉じたときにサーバが認識します。その側から。悪名高い「ERROR_NETNAME_DELETED」エラーをエラーとみなすことはできますか?
すべてが正常に動作しますが、私は事に気づいた:
iがclosesocket(client_socket)を呼び出します。接続のサーバー側のエンドポイントで、クライアント側ではなく(linger {true、0}を設定するかどうかで)、保留中の読み取りはエラーとして完了します。つまり、 です。読み取りサイズは= = 0だけでなくGetLastError()もエラー:64、または 'ERROR_NETNAME_DELETED'を返します。私はウェブ上でこれについて多くを検索しましたが、興味深いものは何も見つかりませんでした。
次に私は自分自身に尋ねました:しかし、これは本当の誤りですか?これは本当にエラーとみなされますか?
問題はサーバー側では、私がclosesocket(client_socket)を呼び出したときにonError()コールバックが呼び出されることです。 onEof()の代わりに。だから私はこれを考えた:
私は、この 'ERROR_NETNAME_DELETED ""エラー "が受信されたら、onError()の代わりにonEof()を呼び出すのはどうですか? いくつかのバグや未定義の動作が導入されますか?私はこの質問を作っ もう一つの重要なポイントはこれです:
私は私は特に、NTSTATUSエラーが含まれているoverlapped->内部パラメータと重なる 構造をチェックして、これは「ERROR_NETNAME_DELETED」で完了したことを読んで受け取った基礎となるドライバのコード NTSTATUSエラーコード[http://www.tenox.tc/links/ntstatus.html]の一覧が表示された場合、 は「ERROR_NETNAME_DELETED」がNTSTATUS 0xC000013Bによって生成されていることを明確に確認できますが、これはエラーですが、「STATUS_LOCAL_DISCONNECT」と呼ばれています。まあ、エラーの名前のようには見えません。エラーである `ERROR_IO_PENDING 'に似ているようですが、正しい動作のステータスもあります。
OVERLAPPED構造体の内部パラメータをチェックするのはどうでしょうか?これが== 'STATUS_LOCAL_DISCONNECT'の場合は、onEof()コールバックの呼び出しが実行されますか?物事を混乱させるだろうか?
さらに、サーバー側から、私がDisconnectEx()を呼び出す前に closesocket(client_socket)を呼び出す必要があります。私はそのエラーを受け取りません。しかし、私はDisconnectEx()を呼びたくないのはどうですか?例えば。サーバーがシャットダウンしていて、DisconnectEx()の完了をすべて待つのではなく、接続されているすべてのクライアントを閉じるだけの場合。
@ハンス、彼は彼がそのエラーに遭遇した方法を説明する素晴らしい仕事をしたと思います。 –