問題タブ [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.
windows - IO完了ポートパケットはいつ送信され、いつ送信されませんか?
私は現在、IO完了ポートを使用する名前付きパイプに基づくIPCメカニズムに取り組んでいます。
残念ながら、msdnのドキュメントに問題があります。これは、ReadFile / WriteFileを呼び出すと、完了パケットが生成されるかどうかがはっきりしないためです。
ERROR_IO_PENDINGでFALSEが返される場合は明らかですが、ERROR_MORE_DATAが返される場合の明らかに可能な場合はどうでしょうか。この場合、完了パケットはありますか?さらに、他のエラーが返された場合はどうなりますか?どの場合、完了ハンドラーではなく、結果を処理してリソースを直接解放する必要がありますか?
もう1つのケースは、ReadFile / WriteFileが成功した場合ですが、これも可能です。ありがたいことに、MSDNはこれについてかなり明確です:
さらに、WriteFile関数は、非同期ハンドルを使用している場合でも、GetLastError値がERROR_SUCCESSの場合にTRUEを返すことがあります(ERROR_IO_PENDINGの場合はFALSEを返すこともあります)。...この例では、完了ポートルーチンがそのようなリソースのすべての解放操作に対して単独で責任を負うことを許可することをお勧めします。
この推奨事項はすべての場合に正しいのでしょうか。また、完了ポートに割り当てられたハンドルに対するReadFile / WriteFile操作の結果は、パケットがポートに送信されるため、実際には完全に無視できますか(実際には無視する必要があります)。
timer - オーバーラップ I/O をサポートするタイマー (IOCP 用)?
I/O Completion Ports (IOCP) に基づくアプリケーションにタイマーのサポートを追加する必要があります。タイマーを管理するために特定のスレッドを使用することは避けたいと思います。
Linux では、ファイル記述子 (timerfd.h man を参照) を介して有効期限通知を配信するタイマーを作成できるため、アプリケーションが epoll に基づいている場合、たとえば epoll で使用すると便利です。
Windows では、非同期プロシージャ コール (ACP) で「待機可能なタイマー」を使用できます ( http://msdn.microsoft.com/en-us/library/ms686898(v=VS.85).aspxを参照) 。
興味のある方は、kqueue (BSD、Mac OS) はデフォルトでタイマーをサポートしています (EVFILT_TIMER を参照)。
I/O Completion Ports では、オーバーラップ I/O をサポートするオブジェクトを使用する必要があります。それで、 IOCP 用のそのようなタイマーはありますか?
よろしくお願いします、
セドリック
windows - WindowsXPでIOが重複しているWSASYSCALLFAILURE
オーバーラップしたソケットでWSARecvとWSAGetOverlappedの結果を使用するコードにバグがあります。負荷が高い場合、WSAGetOverlappedはWSASYSCALLFAILURE(「失敗してはならないシステムコールが失敗しました」)で戻り、その後TCPストリームが同期しなくなり、プログラムの上位レベルで混乱が発生します。
これまでのところ、特定のハードウェアまたはドライバーのセットに分離することはできませんでした。誰かがこの問題にもぶつかり、解決策や回避策を見つけましたか?
winapi - ReadFileを呼び出すと、ERROR_WORKING_SET_QUOTAが返されます
プログラムは数分間正常に実行され、その後、ReadFileはエラーコードERROR_WORKING_SET_QUOTAで失敗し始めます。
私は次のように重複したI/OでReadFileを使用しています。
なぜこのエラーが発生するのですか?
linux - Linux での Windows NAmed Pipes の代替
既存の Windows コードを Linux に移植しています。ACE を抽象化レイヤーとして使用しています。複数のクライアントと通信し、重複した操作を実行するためにパイプという名前のウィンドウを使用しています。
Linuxでこれに相当するものは何ですか。Linux の名前付きパイプ (FIFO) を確認しましたが、それらは 1 つのクライアントとサーバーのみをサポートしているようで、オーバーラップ IO はサポートしていません。
これについて私を案内してもらえますか。
c++ - 大きなファイル転送中にWSASendが失敗するのは正常ですか?
誰かが分を持っているなら、私は少し助けが必要です。IO完了ポートを使用してWebサーバーを作成しましたが、大きなファイルを送信するのに問題があります。Webページは正常にロードされているように見えますが、大きなファイル転送中に、WSASend()は数分後に失敗し、「指定されたネットワーク名は使用できなくなりました」というエラーが表示されます。
現在、重複する操作が失敗すると、サーバーは関連付けられた接続を閉じるだけです。これは正しいことですか?または、ソケットを閉じる前に、失敗した重複操作を数回再試行する必要がありますか?私はtcp/streamソケットを使用しています。
(修正済み)WSARecvからランダムな0バイトパケットのように見えるものも受信しています。これをどうすればいいのか、問題が関連しているかどうかわかりません。(/修正済み)
助けてくれてありがとう
編集:サーバーが接続を適切に処理し、はるかに包括的なログを持っているので、Lenは正しいようです。クライアントが何らかの理由で接続を閉じています。
ログ:
問題は、なぜクライアントが接続を閉じるのかということです。発生するまでに2〜5分かかります。バッファサイズを送信ごとに4098バイトに減らし、最初のチャンクが完了したときにのみ次のチャンクを送信します。
これについてのアイデアをありがとう。
ps再試行機能を実装しただけでも、失敗した重複IO操作を5回再試行してから、あきらめます....それでも運がない=(
createfile - WriteFile() 呼び出しは x86 では機能しますが、x64 では機能しません。エラー コード 6 の取得 -- VB.NET を使用したハンドルが無効です
CreateFile、WriteFile、および ReadFile API 呼び出しを使用して、データを USB デバイスに書き込みます。私が持っているコードは、32 ビット システムで完全に動作します。CreateFile はデバイスへのハンドルを取得し、そのハンドルといくつかのデータを WriteFile に渡し、ReadFile でそのハンドルから読み取ります。
私の問題は、同じコードが 64 ビット システムでは機能しないことです。WriteFile から返されたエラーは 6 です。ハンドルが無効です。CreateFile 呼び出しでハンドルの有効性を確認しましたが、有効なハンドルです。GetLastError() を呼び出すと、CreateFile の後に 0 が返されます。「ファイル」は重複した通信用に開かれており、重複した init 呼び出しも適切な値を返しています。
私の質問: 64 ビット システムであるため、他に考慮する必要があることはありますか? 違う旗?まったく別の呼び出しですか?
念のために言っておきますが、コードを同期させるためにコードを少しハックして(OVERLAPPEDを取り出しました)、それが機能したので、問題はOVERLAPPED構造または呼び出しの初期化方法にあると想定しています.
どんな助けでも大歓迎です。
編集:
以下は、私の API 署名と、OVERLAPPED 実装に使用しているコードです。
以下は、問題が発生する書き込みのコードです。読み取りでは、OVERLAPPED 構造体の hEvent パラメータが同じ方法で初期化されることに注意してください。
c++ - AcceptEx は 1022 (WSAEINVAL) を返します... 何を間違えましたか?
完了ポート用の小さなテストサーバーをコーディングしようとしています。しかし、AcceptEx を呼び出そうとすると... winsock エラー コードとして常に WSAEINVAL が返されます... 何が間違いだったのかわかりません
http://codepad.org/NEXG3Ssh <- コードパッドのコード
と
winapi - コンソール入力にオーバーラップ IO を使用していますか?
FILE_FLAG_OVERLAPPED フラグを指定して CONIN$ を開いて、オーバーラップ IO を使用してコンソールから入力を読み取ろうとしています。ただし、OVERLAPPED パラメータを使用しても、ReadFile を使用するとブロックされます。
これが Windows 7 のバグであると報告している投稿をいくつか読みました。私は7を使用しているので、それは可能です。
私が使用しているコードは次のとおりです。
c++ - アプリケーションが COM ポートからシリアル データを受信しない - C++
アプリケーションが COM ポートからデータを正しく受信していません。これは以前は機能していました。何が起こったのかわかりません。プロトコル アナライザーで確認できるので、回線上で適切なデータが送受信されていることがわかります。
PC はこのWAIT_OBJECT_0 + 1
状態になりますが、バッファの内容は常にゼロです。これがたくさんあることは知っていますが、誰かが私が間違っていることを指摘できれば、本当に感謝しています. リクエストに応じて詳細を追加/削除できます。ありがとう。
編集:追加情報
ReadFileEx
PC が を呼び出し、「成功」することを確認できました。ただし、PC は には入りませんFileIOCompletionRoutine
。何か案は?(コードからエラー処理を削除して、作業を簡素化しました。) また、MSDN Web サイトで読んだところによるとFileIOCompletionRoutine
、独自のスレッドで非同期的に呼び出されるようです。あれは正しいですか?ありがとう。
編集:最終的な解決策
これが私が思いついたものです。明らかに、初期化とエラー処理のコードはここにはありません。物事を簡単にすることはできません。:)