問題タブ [iocp]
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++ - 同じコンテナー内の IOCP 複数のソケット完了ポート
過去数日間、私は自分が直面している問題の 1 つを解決する方法を考えていました。そのトピックについて調査しようとしましたが、何ができるか本当にわかりません。
同じ構造体に 2 つのソケットがあり、両方とも同じ完了ポートを持っています。問題は、両者が異なるプロトコルを使用していることです。どのソケットがトリガーされたかを確認する方法はありますか? 呼び出された game_socket と client_socket
サンプルコードは次のようになります...
アイデアや助けをいただければ幸いです:)
c++ - C++ IOCP サーバー コンテナー情報
KISS を維持しながら IO タイプのアーキテクチャを使用して実際に大量の接続を含める方法について、頭の中でいくつかのアイデアを回してきました。Web 上の例を見ると、ほとんどの場合、CONTAINING_RECORD を使用して二重/単一のリンク リストを使用しているようです。そして、IO サーバーの初心者 (とはいえ、日々改善しています) として、私も IO アーキテクチャにリンク リスト コンテナーを使用しています。
私の質問は、接続にシングル/ダブル リンク リストを使用する代わりに、大きな配列を作成して CONTAINING_RECORD を使用できないのはなぜですか? STLベクターは使えますか?それはうまくいくでしょうか?また、大規模なIOサーバーで最適に機能する他のタイプのコンテナは何ですか.
私はゲーム サーバーのサーバー アーキテクチャを (何度も改訂した後) 書き直している最中です。今回は正しい方向に進みたいと考えています。
お時間をいただき、ありがとうございます。
編集:現在、私のサーバーアーキテクチャは(一言で言えば):
メイン スレッドとワーカー スレッドはすべてリンク リストを使用します。私はこれから離れたいです。
c++ - ソケットに IO を設定する
ソケットを使用してサーバーに接続する C++ プログラムがあり、ソケットのオーバーラップを設定する必要があります。以下を実行しても機能しません。
関数
拡大
proxy_client 構造体
主要
(サーバーから)ソケットデータを送信した後、ServerCompletionPortのGetQueuedCompletionStatusを取得しても、これはソケットをトリガーしないようです。ソケットの IO を設定する方法を考えていました。助けてくれてありがとう!:-)
c++ - WinSock2 IOCP WSARecv GetQueuedCompletionStatus: データは (自動的に) WSABUF.buf ではなく char*buffer になります...なぜですか?
デバッグ中に WSARecv が呼び出されると、関数にPerIoData->WSABUF構造体のアドレスを指定します。これにより、送信されたデータがWSABUF.buf char* 配列に割り当てられるようになります。ワーカースレッドが待機中のGetQueuedCompletionStatusにループバックすると、どういうわけか (魔法のように) そのデータが PerIoData.Buffer (char* 配列) に送信されるように見えます。したがって、基本的に、PerIoData.BufferとPerIoData.WSABUF.bufは両方とも同じ char* 配列に等しくなります。PER_IO_DATA構造体(およびそれへのすべての参照)からPerIoData.Bufferを削除すると、GetQueuedCompletionStausは、クライアントがデータを送信しても返されませんが、WSABUF.bufにデータを入力する必要があります。
関連情報:
- 「Microsoft Windows のネットワーク プログラミング」(p.157) にある Completion Port Model を実装しています。その本の例は、個別に発見する必要がありましたが、私のコードは今では正常に動作します。
- ServerWorkerThread の while ループ: 最初に呼び出される GetQueuedCompletionStatus は、per_handle_data と per_io_data を受け取ります。
per_io_data 構造体は次のとおりです。
/li>私の GetQueuedCompletionStatus 関数は次のように呼び出されます。
ret = GetQueuedCompletionStatus(CompletionPort, &BytesTransferred, (LPDWORD)&PerHandleData, (LPOVERLAPPED *)&PerIoData, INFINITE);
私の WSARecv 関数は次のように呼び出されます。
WSARecv(PerHandleData->Socket, &(PerIoData->DataBuf), 1, NULL, &Flags, ((LPWSAOVERLAPPED)&PerIoData->Overlapped), NULL); //i know casting the Overlapped structure as LPWSAOVERLAPPED is unnecessary, but I was tweaking the //code when I didn't fully understand the problems I was having.
私の問題は、PerIoData->Bufferに明示的に何かを割り当てることはありませんが、送信されたデータが常に読み込まれるように見えることです。GetQueuedCompletionStatus は、このデータをそのPerIoData->Bufferに送信することを「知っている」と信じていますが、 LPOVERLAPPED構造体へのポインターを期待しています(これに、問題のBuffer char 配列を含むPerIoData構造体インスタンスを渡します)。それは本当に私を悩ませています...たぶん、私が考えているように動作していないかもしれませんが、PerIoData->Bufferが読み込まれているのを見ることができる唯一の場所は、 GetQueuedCompletionStatusメソッド内からです。そうでない場合は、PerIoData->Bufferどこからともなく密集しているように見える?私は何日も MSDN と google を精査してきました。探し続けて、答えが見つかったら更新を投稿します。助けてください?前もって感謝します!
*注意: タグ WSABUF と GetQueuedCompletionStatus を作成したかったのですが、これが初めての投稿です。
-- 編集: 構造体とワーカー スレッドを掲載していますが、関連のない他のコードはすべて 除外しています。myBuffer 配列を指していない....
udp - Windows XP と 7 の違い、UDP 受け入れルールの違い
UDP パケット (特に rtp) を取得すると、別の現象が発生します。Windows 7 Professional K では、Windows のバージョンの違いにより発生します。
私のPCではUDPポートを開かなくてもUDPパケットは正常に受信されますが(wiresharkで見ました)、Windows XP SP3では、UDPポートが開いていないとUDPパケットは送信されません。
パケットのちょうど半分は正常に到達しますが、残りは到達しません。それで、私のPCはICMPタイプ3(到達不能ポートエラー)パケットを作成して送信します。
具体的に何が違うのか知りたいです。
winsock - GetQueuedCompletionStatus ハング
プログラムがフリーズしている理由を突き止めようとしていますが、GetQueuedCompletionStatus() に絞り込みました。
すべての IOCP スレッドが凍結され、スレッドが持つ唯一のブロッキング呼び出しは GetQueuedCompletionStatus() です。
関連付けられたソケットに接続している顧客がまだいる場合でも、約 30 分 ~ 6 時間の実行時間後に GetQueuedCompletionStatus() が永久にブロックし続ける理由はありますか?
これは IOCP を使用する TCP Winsock プログラムです。OSはWindows Server 2008 R2 Enterpriseです。
ありがとう。
スレッド コード:
c++ - asio のソースコードで iocp に関するコードはどこで入手できますか?
iocpの使い方を完璧に学びたかったのですが、機能が見つかりませんでしたCreateIoCompletionPort
。
私はasioのすべてのファイルを調べましたが、いくつかのファイルしか見つかりませんでした.cpp
!
ソースコードを調べるにはどうすればよいですか?
windows - IO 完了ポートは、完了ポートが何かを報告する前または後に新しいスレッドを生成しますか?
IO 完了ポートが完了すると実際に何が起こるかについて、少し混乱しています。
Win API は、特定のハンドル (ソケットとしましょう) を持つコールバック参照を何らかの方法でキューに入れる (またはスタックする) ことができる IOCP キューへのアクセスを許可していると思います。Windows が NIC から割り込みを受信すると、ある時点で NIC の IOCP キューに到達し、独自の(IOCP) スレッド プールでコールバックを実行します。
私の質問は、割り込みが受信されたときに生成されたスレッドプールからのこのスレッドですか、それとも実際にはWin APIへの呼び出しが行われたときに生成され、IOCPによって起こされるまでスレッドを効果的に待機状態にします列?
編集:私は
これを見つけました: http://msmvps.com/blogs/luisabreu/archive/2009/06/04/multithreading-io-and-the-thread-pool.aspxは、その I/O 完了ポートでパケットをキューに入れます。ポートは次に進み、スレッド プールのスレッドの 1 つを使用して、指定したコールバックを実行します。」
c# - IOCP スレッド処理
Win APIを呼び出して、C#でIOCPサーバーを作成しています。CPUコアに応じて、1つの受け入れスレッド接続とワーカースレッドがあります。
私の問題は、2 つのスレッドが同時に同じデータを処理しようとしているということです。次のスニペットに基づいて、解決策を教えてもらえますか、それともこれは設計上の問題ですか?
また、WSASend と WSARecv を使用して、データの部分的な送信または部分的な受信を取得することは可能ですか?
windows - 失敗した DisconnectEx/AcceptEx は、重複した IOCP イベントを引き続きスケジュールします
Windows 8、x64。
重複した Windows ソケット API を IOCP で使用します。
ソケットの予期しない動作に気付きました: たとえば、DisconnectEx を呼び出すとエラー WSAENOTCONN が返されますが、後で GetQueuedCompletionStatusEx でイベントを受け取ります (返されたエラーに関係なく、スケジュールされていたように)。AcceptEx でも同じことが起こります (WSAEINVAL など、別のエラーが返されます)。
IOCP イベントは、保留中の操作 (エラー コード WSA_IO_PENDING が返された) に対してのみスケジュールされ、他のエラーに対してはスケジュールされないと予想していました。
EDIT :私の質問は、DisconnectEx/AcceptEx の呼び出しが WSA_IO_PENDING ではないエラー (WSAGetLastError) を返した場合でも、システムによって IOCP イベントをスケジュールできますか?
ありがとうございました!