問題タブ [overlapped-io]
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.
visual-c++ - FTDI D2XX USB ケーブルの切断と再接続後のオーバーラップ IO (OIO) のキャンセル
私のアプリケーションは、USB ベースの FTDI チップと D2XX ドライバーを使用しています。OIO (Overlapped IO) を使用して、USB への読み取りと書き込みを行います。私の要件には 30 秒のタイムアウトが含まれており、これを減らすことはできません。コードは非常に堅牢で安定しているように見えます。
新しい要件は、USB ケーブルの不注意による切断と再接続 (看護師がケーブルを蹴り飛ばした) を克服することです。
Windows からデバイス削除メッセージを受信し、それが FTDI デバイスであると判断すると、以前の OIO 呼び出しタイムアウト (要件からの 30 秒のタイムアウト) まで、OIO からの再接続で新しいデータを受信できないことがわかりました。
切断を発見したら、キューに入れられたすべての OIO が取得されるまで、次の呼び出しをループします。
タイムアウト期間を 1ms に設定しました。これは、以前にスケジュールされた OIO のタイムアウトを変更するようには見えません。
私はFT_W32_PurgeComm
すべてをキャンセルするために電話しました。これも、OIO をキャンセルするようには見えません。
呼び出しCancelIo
てみましたが、エラーが返されました。ハンドルが無効です。私の理解では、それに応答するのはドライバーコードです。切断が原因である可能性があります。
とにかく、スケジュールされたすべての OIO が取得されるまで、上記のコードをループで呼び出します。30秒間何も起こりません。その後、すべての OIO が 1 ミリ秒未満で終了するようです。
このコードのテストとして、USB ケーブルを接続して呼び出したところ、1ms で返ってきました。
したがって、問題はケーブルを抜いたときのようです。
質問: 何が欠けていますか? 他にかけられる電話はありますか?これはバグですか?
私が試した他のこと: を呼び出す前にハンドルを閉じFT_W32_GetOverlappedResult
ます。これにより、リターンが速くなります。しかし、私のアプリは新しいハンドルからデータを受信できなくなりました。変。理由を知っている人はいますか?
このコードを呼び出していません。アプリは新しいハンドルから新しいデータを受信できますが、これらのタイムアウト後にのみです。なぜ?
サイクルポート。これにより、これらの OIO がより迅速に戻ることはありません。これらのタイムアウトまで、OIO 受信データの使用は変更されません。
vb.net - VB .Net の WriteFile API でオーバーラップ構造を使用するにはどうすればよいですか
VB .Net を使用して Kernel32.dll WriteFile API を呼び出します。
Public Declare Function WriteFile Lib "kernel32" _
( _
ByVal hFile As IntPtr, _
ByVal lpBuffer As Byte(), _
ByVal nNumberOfBytesToWrite As Int32, _
ByRef lpNumberOfBytesWritten As Int32, _
ByVal lpOverlapped As IntPtr _
) _
As Boolean
この関数のオーバーラップ構造 (lpOverlapped) を作成する方法と、それを正しく渡す方法 (API はポインターを想定していますか?) を教えてもらえますか?
私が見つけたすべての情報は、使用可能な例を示していないか、複雑すぎて理解できないか、VB .Net 用ではありませんでした...
sockets - ConnectEx を同じ IP アドレスとポートに接続する 2 つのソケットが重複した IOCP イベントを生成する
ソケット通信に IOCP を使用するクライアント アプリケーションがあります。ConnectEx を使用して、リモート エンドポイントへの TCP 接続を確立しています (ConnectEx を呼び出す前に、ソケットを ADDR_ANY およびポート 0 にバインドします)。
同じリモート エンドポイント (同じ IP アドレスとポート番号) への 2 つの接続を持つことは有効です。現在のコードでその条件をテストすると、WSARecv() への呼び出しから未処理の 2 つの重複した IO 読み取り操作 (接続されたソケットごとに 1 つ) があります。各 WSARecv() は、正しいソケットと重複した構造で呼び出されます。例: WSARecv(socket1, ... オーバーラップ 1) および WSARecv(socket2, ... オーバーラップ 2)。私が遭遇した問題は、どちらかのリモートから応答が返ってきたときに、両方の未解決の重複操作の完了イベントをトリガーすることです。私のコードは、2 つのリモートが同じ IP アドレスとポート番号を持っている場合にのみこの結果を生成し、2 つの一意のリモート アドレスがある場合には生成しません。これは予想される動作ですか (そうでないことを願っています)。もしそうなら、これを達成する別の方法はありますか?