問題タブ [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++ - パケットのタイミングの問題
8秒ごとにサーバーにパケットを送信するクライアントがあります。サーバーは、パケットの送信が速すぎることを検出すると、クライアントを切断します。クライアントでは、Sleep(8000) を呼び出します。パケットを送信する前に。サーバー側では GetTickCount(); を使用します。パケット間の時間を計算します。私はこれが問題なく動作することを期待していましたが、切断され続けています。
WireShark を使用してパケット時間を確認したところ、次のようになりました。 Packet# Time 17 8.656064 72 16.957240 115 24.764741
24.764741 - 16.957240 = 7.807501 < 8 が切断された理由です。クライアントで Sleep(8000); を呼び出すため、これがわかりません。そのため、8 秒以上ごとにパケットを送信する必要があります。
2 番目のパケットは 0.3 秒遅く、3 番目のパケットは約 0.2 秒早いです。これらのパケットを時間内に送信する方法はありますか?
c++ - Winsock IOCP サーバー ストレス テストの問題
TCP IP 接続を使用して c++ で書かれた winsock IOCP サーバーがあります。クライアント シミュレーターでループバック アドレスを使用して、このサーバーをローカルでテストしました。私は 60,000 人以上のクライアントを簡単に獲得することができました。私が抱えている問題は、私の家でサーバーを実行し、友人の家でクライアントシミュレーターを実行するときです。約 3700 の接続に到達するまではすべて正常に動作します。その後、connect() へのすべての呼び出しがクライアント側から失敗し、10060 が返されます (これは winsock のタイムアウト エラーです)。昨夜、この数は 3700 でしたが、以前は約 300 でした。また、1000 近くも見ました。しかし、その数が何であれ、シミュレートしようとするたびに、その数のすぐ近く (10 程度以内) で失敗します。 .
どちらのコンピューターも Windows 7 Ultimate を使用しています。また、TCPIP レジストリ設定 MaxTcpConnections を約 1600 万に変更しました。また、MaxUserPort 設定をデフォルトの 5000 から 65k に変更しました。イベント ビューアに有用な情報が表示されません。また、リソース モニターも確認しましたが、ネットワーク使用率が 1% に達していません。CPU 使用率もほぼ 0% です。
ISP との電話を切ったばかりで、彼らは私たちを制限していないと言っていますが、その人は少し確信が持てず、30 分間の保留時間の後、結局電話を切りました...
この問題を解決するためにあらゆることを試みていますが、解決策が見つかりません。誰かがこの問題について私たちに手を差し伸べてくれたら、とてもうれしいです。
PS両方のコンピューターは、同じベライゾンルーターを備えたベライゾンFIOS上にあります。もう 1 つの注意点として、サーバーは AcceptEx ではなく WSAAccept を使用しています。ただし、クライアント シミュレーターは何秒にもわたって接続を試みているため、接続がバックログされていないことは確かです。クライアント シミュレーターが接続する速度を変更しようとしましたが、設定されている速度に関係なく、毎回ほぼ同じ速度で失敗します。
更新 ネットワーク A 上の 2 つの別個のクライアント (2 つの別個のマシン上) をシミュレートしました。サーバーはネットワーク B で実行されていました。各クライアントは、半分 (約 1600) の接続しかサーバーに接続できませんでした。最初は 1,000 未満のポートを使用していましたが、これは 50,000 を超えるポートに変更されました。両方のマシンのルーター ログには何も表示されませんでした。どちらも Actiontec MI424WR verizon FIOS ルーターを使用しています。これにより、問題はクライアント コードにあるとは思えません。サーバーはエラーをスローせず、予期しない動作もありません。これは ISP/ルーターの問題でしょうか?
更新 解決策が見つかりました。私たちが使用していた Verizon ルーター (MI424WR リビジョン C) は、3700 を超える接続を処理できません。別のネットワーク セットでこれをテストしました。助けてくれてありがとう!
ありがとう - リック
c - リソース Windows で IOCP を学習するには
私は最近、Windows の IOCP と呼ばれるものに気づき、それに関する詳細情報を検索し始めましたが、最新のものを見つけることができませんでした (ほとんどの例は、ほぼ 5 年前の codeproject にありました)。チュートリアル。オンライン チュートリアルやサンプル プロジェクト (あなたが書いて共有できるもの、または他のオープン ソース プロジェクト) の形で、それに関する最新のリソースをお勧めできますか。それは広範囲に及ぶので、私はそれに投資します。
ありがとうございました。
iocp - IOCP で使用中の wsarecv の問題
私はIOCPを初めて使用し、ここ数週間これに苦労しています。IOCPに関連するコードのコア部分を以下に貼り付けました。理解しやすくするために一部を切り取っているため、完全に実行されない可能性があります。データの受信に苦労しています。ワークスレッドで wsarecv になると、wsarecv が WSA_IO_PENDING エラー コードを返すので、WSAGetOverlappedResult を呼び出して、操作が完了するかどうかを確認します。ツイストがここに来ます。むしろ、 WSAGetOverlappedResult の後にローカル関数 ProcessTelegramData を呼び出します。コードの同じ部分 (wsarecv が再度呼び出されます) が、 ProcessTelegramData を呼び出そうとする別のワーカー スレッドによって再度実行され、バッファ値が無効です。WSAGetOverlappedResult が呼び出されたときに別のスレッドが wsarecv を再度呼び出している理由と、バッファ値が無効になっている理由を理解できません。
c++ - iocpエラー、時々メッセージを受信できません
iocpコードは以下のとおりです。
上記の関数は、ロジックスレッドとは異なるスレッドで実行されています。通常はエラーログは出力されませんが、ゲームサーバーが稼働しているとクライアントメッセージを受信できず、クライアントにもメッセージを送信できませんが、しばらくするとサーバーは自動的に正常になり、メッセージを受信し、メッセージを送信できます。しばらくすると、サーバーはメッセージを送信および受信できなくなります。これは定期的に発生します。エラーログは次のとおりです。
2011-09-13 04:48:41 GetQueuedCompletionStatusバック回false、errno = 64、addr = 227492836、type = 2、sockfd = 4294967295
2011-09-13 04:48:41 GetQueuedCompletionStatusバック回false、errno = 64、addr = 227492836、type = 2、sockfd = 4294967295
2011-09-13 04:48:41 GetQueuedCompletionStatusバック回false、errno = 64、addr = 227492836、type = 2、sockfd = 4294967295
...同じものがもっと...
2011-09-13 04:48:41 GetQueuedCompletionStatusバック回false、errno = 64、addr = 227492836、type = 2、sockfd = 4294967295
上記はログファイルの一部にすぎません。ご覧のとおり、エラーログが大量に印刷され、エラー番号は64、ソケット記述子は4294967295(0xffffffff)です。エラーログを印刷すると、サーバーはできません。メッセージを送信し、メッセージを受信できません。この問題を解決する方法を知りたいのですが、ありがとうございます。
winapi - CreateFile() は INVALID_HANDLE_VALUE を返しますが、GetLastError() は ERROR_SUCCESS です
CreateFile()を使用してシリアル ポートを開いています。CreateFile()
一貫して returnINVALID_HANDLE_VALUE
とGetLastError()
returnを引き起こすテストケース (再配布するには複雑すぎる) がありERROR_SUCCESS
ます。一見すると、このバグは、あるスレッドがポートを開き、別のポートが閉じるのとまったく同じ場合にのみ発生します。ポートを開くスレッドは、この問題に遭遇します。
これが違いを生むかどうかはわかりませんが、コードの後半で、CreateIoCompletionPortを使用してポートを CompletionPort に関連付けます。
これが私のコードです:
このようなことはあってはならないと確信しています。私は何か間違ったことをしていますか?API が正しい結果を返すようにするにはどうすればよいですか?
詳細: このコードは、私が開発したシリアル ポート ライブラリから取得したものです: JPeripheral
実際の (サニタイズされていない) ソースコードは次のとおりです。
これが私が得る実際の出力です:
winsock - WSASend 呼び出しの複数の即時数とデータ送信順序
ご存知のように、WSASend-completion-WSASend-...(repeat) はデータを順番に送信することを保証します。ただし、WSASend-WSASend-WSASend-completion-completion-completion はデータを順番に送信することも保証すると聞きましたが、完了の順序はそうではありません。そうですか?
返信してください。前もって感謝します。
ペ・ヒョンジク
windows - ConnectEx を使用しない Windows でのノンブロッキング ソケット接続
1 つのプロセスで数千のクライアント接続を開始する必要があります。回避する必要がある主な制限は、ドライバーが ConnectEx をサポートしていないため、純粋な IOCP ソリューションを使用できないことです。
私が最初に考えたのは、接続を処理するためのスレッド プールです。各ハンドルは、単純な接続/選択セマンティクスを使用して最大 64 の接続を処理でき、接続されると IOCP を続行します。しかし、これは機能しません。select が実行されると、別のソケットを FD_SET に追加することはできません。したがって、ソケットをノンブロッキングに設定し、代わりにポーリングする必要があります。
最善の解決策は、最も単純なものかもしれません。スレッドごとに1 つの接続クライアント。接続レートを適切に維持できると仮定すると、プール内のスレッドの数は少なくなる可能性があります。
これは奇妙な状況です。ドライバーが ConnectEx をサポートするのが理想的ですが、(今のところ) サポートしていないため、可能な限り最善の方法で回避する必要があります。
別の方法はありますか?
windows - Winsock SPI で ConnectEx、AcceptEx を実装する方法
これらはマイクロソフト固有の拡張機能であり、サードパーティのドライバーに実装できるかどうか疑問に思っています。これらは両方とも、純粋な IOCP クライアントおよびサーバー コードを実装するために必要です。SPIページのFunction Extension Mechanismは情報が少し薄いです...
asp.net - 複数の HTTP リクエストを送信して、同じ I/O 完了ポートを待機する
私のアプリケーションは、Web サービスと "Application_Start" から大量の情報を非同期にロードします。
ユーザー要求がその情報を使用したいが、準備ができていない場合、スレッドは Monitor.Wait でブロックされます。情報の準備が整うと、キャッシュ オブジェクトは、待機中のすべてのスレッドを Monitor.Pulse します。情報には数十秒かかり、ユーザーはログイン ページにリダイレクトされ、ログイン情報を投稿し、再度リダイレクトされる必要があるため、これで問題ありません。
問題は、Monitor.Wait が CLR ThreadPool スレッドをブロックすることです。「大きな情報」を要求する要求のバーストが到着したかどうかを知る限り、アプリケーションは CLR ThreadPool の枯渇によってブロックされたままになる可能性があります (私は少し混乱しています)。現在の IIS/ASP.NET スレッド ゲーティングを使用)。
大部分の情報は、非同期で呼び出す Web サービスから取得されるため、その操作の IAsyncResult を取得します。
では、CLR ThreadPool スレッドに「この IOCP を待機する」ように指示して、スレッドプール スレッドが他の呼び出しに参加できるようにする方法はありますか?
これはよく説明されていないように感じます。質問の内容が明確でない場合はお知らせください。
よろしく。
PS: 報奨金は終了しましたが、その方法を誰かが知っている場合は、新しい方法を作成して著者に付与します。