2016-12-02 42 views
-1

(Linux上で動作する)データベースサーバと非同期通信(ソケットを使用)を使用するクライアントアプリケーション(Windows上で実行中)での問題。WSAECONNRESETエラーが発生したときにサーバーの応答メッセージを読み取ることができません。

クライアントアプリケーションは、サーバーにデータをロードする際にWSAECONNRESETエラーでヒットし、サーバーはソケットを終了します。私はWSAGetLastError関数を使用して、エラーメッセージを抽出しました。 WSAECONNRESETエラーでソケットを終了する前に、サーバーがクライアントにいくつかのメッセージ(アプリケーション固有のエラーメッセージを報告)を送信しました。クライアントがサーバーから送信された最後のメッセージを抽出できません(ソケットが閉じられ、 "recv"関数が失敗したため)。私の質問はです。データベースサーバー(Linux上)からクライアント(Windows上)に送信された最後のメッセージを抽出する方法はありますか?

このケースは、linuxデータベースサーバーとlinuxクライアントで正常に動作しています。つまり、UnixソケットからUnixソケットへ。しかし、問題はLinuxソケットからWindowsソケット通信までしか発生しません。

お願いします。よろしくお願いいたします。

+0

私はTCPタグを追加しました。うまくいけば、専門家の一人がチャイムします。しかし[Wikipediaによる](https://en.wikipedia.org/wiki/Transmission_Control_Protocol#Connection_terminationによる)クライアントがエラーメッセージの受信を確認する前に接続を確認してください。 –

+0

@HarryJohnston彼は*接続をリセットすることでルールを破っています。それを正しく閉じることは、未読データがある場合にのみその旨を行うことができます。Wikipediaのステートメントは正しくありません。私はそれを修正しました。 – EJP

答えて

1

できません。 'Connection reset'は接続を破壊し、受信機に既にバッファされているものを含め、すべての機内データが失われます。

リセットが発生する問題を解決する必要があります。

+0

ちょうどもう一度言及します...コードはlinuxクライアントとLinuxサーバでうまく動作しています。しかし、Windowsクライアント(クロスプラットフォーム)にLinuxサーバーで失敗します。私の知る限り、WindowsとLinuxのソケットの動作と処理は少し異なります。私はsocketがlinuxのファイル記述子だと言っていますが、Windowsではそうではありません。私が間違っているなら、私を修正してください。私は、サーバーからの最後のメッセージ(ソケットを閉じる前に送信する)を読む方法がなければならないと考えています。はい、私はまったくあなたに同意します。ソケットが閉じると、データにアクセスできません。 –

+0

サーバはソケットを閉じる前にエラーメッセージをバッファに入れました。 linuxクライアントが "recv"コールでメッセージを正常に読むことができたら、なぜWindowsクライアントはそれをやり取りできないのですか?それを行う方法がなければなりません。どういうわけか、私はそれを見逃しています! –

+0

EJPが正しく言っていることを理解していれば、問題はコードのどこかにある可能性があります。たとえば、おそらくWindowsクライアントにバグがあります。つまり、必要以上にデータを送信しており、サーバーはそのデータを読み取っていません。明らかに、それはリセットに近いものを変更し、エラーメッセージを破棄させるでしょう。おそらくあなたは[mcve]を提供する方がよいでしょう。 –

関連する問題