問題タブ [casyncsocket]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - MFC ソケット コードの CAsyncSocket アサーションの問題と「不適切な引数」エラーの背後にあるものは何ですか?
私は友人のためにいくつかのコードを見るように頼まれました。(MFCと多くの悪いコードのために躊躇しましたが、彼は勝ちました...)
これは、 を使用するダイアログ ボックス ベースのアプリケーションですCAsyncSocket
。
この問題は、いくつかのノンストップ デバッグ ブレークやその他の同様の現象に現れます。MFC マクロにも問題がありENSURE()
、ソケットの null をチェックします。すべての問題は、MFC の奥深くで発生します。
Vista/XP でテーマを使用するとリソース リークが発生する可能性があることをグーグルで調べたところ、問題はないと思います。
私の数時間のデバッグに基づくと、コードはかなり貧弱ですが、基本的には次のことを行っています。
(接続されている場合は問題ありません。接続されていない場合のみです)
- Connect(server, socket) を呼び出します (派生
CAsyncSocket
オブジェクトで) - で、
OnConnect()
接続が機能しなかった/接続されていないことが通知されます。 - メイン ダイアログ/アプリのウィンドウ タイマー内にタイマーがあります。タイマー イベント/ハンドラーが呼び出されると、接続されているかどうかを確認します。
- 接続されていないことが検出された場合 (これ
OnConnect()
は良くありませんでした)、 を呼び出し、次に (パラメーターなしで) を呼び出しCAsyncSocket::Close()
、次に呼び出しCAsyncSocket::Create()
ますCAsyncSocket::Connect(server, port)
への最初の呼び出しにConnect()
は、 への先行呼び出しがないことに注意してくださいCreate()
。
私の最初の本当の質問:
- 2つの違いは何ですか?なぜ
Create()
必要なのですか?(それを削除するとクラッシュしなくなりますが、接続を再確立しても接続しません)
一般的な質問:
- 上記のコードの設計で正確に間違っているのは何ですか?
- これは一般的にどのように機能する必要がありますか?
編集:
Create()
すべてのパスがthenを呼び出すようにコードを修正しましたConnect()
。
私はまだアサートに問題がありますCAsyncSocket::DoCallBack()
- 以下のコードの最後の行はアサートしています:
それをステップスルーすると、メッセージボックスが表示されます:「不適切な引数に遭遇しました」
ソケットを閉じた後、MFC がソケットをコールバックしようとしていると思います (確かではありません)。コールバック メソッド ( )にありますが、ソケットでDoCallback()
既に呼び出しています。Close()
したがって、最初に購読を解除することになっていない限り、MFC の問題のように見えます。
c++ - CAsyncSocket::クラッシュを閉じる
ねえ、私はWindowsサービスでクライアント/サーバーのことをやっています。このことについてはかなり新しい。
私が直面している問題は、Service Manager を使用してサービスを停止しようとすると、クラッシュすることです。MessageBoxes コードをいくつか追加して、クラッシュしている場所を追跡したところ、リスナー ソケットを閉じるとクラッシュすることがわかりました!!!
コンソールアプリケーションとしてサービスを実行しようとしたところ、自分でSERVICE__CONTROL__STOPイベントと呼ばれる関数を呼び出して、バグの再現とデバッグを簡単に行えるようにしました。しかし、それはうまく機能しています。Windows サービスがクラッシュするのは、サービス マネージャーを使用して停止した場合のみです。
ここにいくつかのコードがあります
主な機能
サービス ハンドラのコールバック関数
OnStop() 関数
EDIT:接続が確立され(クライアントがサーバーに接続し)、クライアントが接続を閉じてからサービスが停止した場合、何もクラッシュしません。ソケットがリッスンしていて接続が受け入れられない場合、またはクライアントが接続を閉じずにサービスが停止した場合にのみクラッシュします:)
クリアだと思います!
visual-c++ - VC ++ 6.0:CASyncSocket :: GetLastError()がアクセス違反を引き起こしているのはなぜですか?
Visual C++6.0を使用しています。Visual Studioインストールのサービスパックレベルはわかりませんが、OSはWin2KSP4です。失敗したコードはDLLの一部です。
コードは次のとおりです。
これは私のビルドシステムでエラーなしでコンパイルされ、m_Clientメソッドの呼び出しが失敗することなく実行されます。このDLLを本番システムに移動すると(Win 2K、サービスパックのレベルはまだわかりません)、m_Client-> Connect()を呼び出すとエラーが返されるため、IFブロックに入ります。CAsyncSocket :: GetLastError()次に、デバッガーを開いて0xC0000005アクセス違反を報告します。私は、分解から何かを引き出すのに十分なこのことを理解していません。
CSocket :: GetLastError()とm_Client-> GetLastError()も試しましたが、同じ結果になりました。
開発システムに存在しない本番マシンにあるセキュリティポリシーが原因でm_Client->Connect()が失敗することはかなり確信していますが、実際のエラーコードを取得して、IT担当者が彼を絞り込むのを支援できるようにしたいと思います。探す。
ビルドシステムでGetLastError()を強制的に呼び出して、そこでアクセス違反が発生するかどうかを確認することはまだ試みていません。
cocoa - 非同期ソケットと「サイレント」切断
私はasyncsocketを使用してWindows.netサーバーへのクライアントとしてcocoaasyncsocketを使用してきました。ProtocolBuffersを使用してメッセージをエンコードしています。一緒に、これらは素晴らしいツールのセットを作ります。
ただし、最近、クライアントをサーバーに接続したままにしておくと、データを要求しようとすると、メッセージは送信されたように見えますが、サーバーに到達しないことに気付きました。ネットワークに問題があった場合のような通常の切断を受信していないため、これを「サイレント」切断と呼んでいます。
デバッグするために次のメソッドを処理していますが、いずれも呼び出されません。
何の通知もなく、私はこれをデバッグするのが難しいと感じています。同様に、サーバーは切断を表示しません。
誰かがこれをさらに分析する方法に私を向けることができますか?
どうもありがとう。
multithreading - CAsyncSocket とスレッド/プロセスの安全性
CAsyncSocket派生クラスを使用するレガシー コードがあります。このクラスはオーバーライドOnReceive
され、SendTo のラッパーもあります。コードは、複数のアプリケーションが同じ PC で使用する dll にあり、すべてのポートはハードコードされています。
名前付きミューテックス (MFC では CMutex) クラス ビットの形式で同期を提供する必要があると思いますが、よくわかりません。
OnReceive で名前付きミューテックスをロックし、CMyAsyncSocket の Send メソッドで別の名前付きミューテックスをロックする必要がありますか?
まったく同期が必要ですか、それとも MFC CAsyncSocket がそれをしてくれますか? 複数のプロセスでソケットにアクセスするのが心配です。
c++ - 異なるコンピューター上にある場合の MFC サーバー/クライアントのタイムアウト
Winsock を使用して MFC で記述されたクライアントとサーバーがあります。それらは同じコンピューター (つまり "127.0.0.1") にある場合にのみ機能しますが、別のコンピューターからクライアントに接続しようとすると、タイムアウト エラーであるエラー コード 10060 が表示されます。これが関連しているかどうかはわかりませんが、1 台のコンピューターはドメイン (学校のコンピューター) に接続されており、もう 1 台はワークグループの下にあるため、それらが問題を引き起こしているかどうかはわかりません。ここにいくつかのコードがあります。サーバー オブジェクトは、CSocket から派生したクラスにリンクされています。
クライアント
サーバ
サーバー受付機能
c++ - CAsyncSocket を安全に閉じられるのはいつですか?
CAsyncSocket
CAsyncSocket
の呼び出し後、コールバックが呼び出されるConnect
前にを削除すると、アプリケーションがクラッシュしOnConnect
ます。 ASSERT(pSocket != NULL)
失敗しCAsyncSocket::DoCallBack
、アプリケーションは終了します。
つまり、 を作成しCAsyncSocket
、それをサーバーに接続しようとして、接続が成功または失敗する前に強制終了すると、問題が発生します。OnConnect
接続試行が完了したことを示すフラグを実装して設定することで、この特定のクラッシュを回避できます。フラグが false の場合、削除するのは安全ではないことがわかります。
オブジェクトを削除する前に確認する必要がある他のケースはありますか? 安全かどうかを確認する単一の方法はありますか? OnReceive
または、開始する可能性のある操作 ( 、OnSend
、 )のすべてのコールバックを実装し、OnConnect
それらのコールバックが呼び出されていることを確認する必要がありますか?
c++ - C++ 停止 CAsyncSocket が単一の大きなパケットを複数の小さなパケットに分割する
サーバーに接続するクライアントを書いています
サーバーが 30kb のサイズのドーム スペシャル パケットをクライアントに送信することがありますが、クライアント側では、複数の小さなパケット (1kb) で 30kb をOnReceive
取得するため、完全なパケットを取得するまでコールバックがほぼ 30 回呼び出されます。
Sleep(1000)
直前にを配置
することでこの問題を解決できたCAsyncSocket::Receive
ので、30kb すべてを 1 つのパケットにまとめましたSleep()
が、配置は非常に悪い考えです。
のために行うべき設定はありますCAsyncSocket
か?