2016-03-22 11 views
5

クライアントでIOCPを使用していますが、サーバーに接続するときにブロッキングコールを使用する方が便利です。だから、ブロックされていないConnectEx()の代わりにブロックWSAConnect()の使用に問題がありますか?WSAConnect()vs ConnectEx()

+3

なぜ同期I/Oが必要な場合は、IOCPをまったく使用していますか? – Mat

+0

@Mat私がうまく理解すれば、OPは便宜上、ブロックするための 'connect'呼び出しを気にします。 @OPブロックする 'future'と' ConnectEx'を混在させたり、IOCPを使用してブロック動作を起こすことを '約束する'ことはできません。 –

+0

@VeronikaPrüssels* "@ Mat私がうまく理解すれば、利便性の理由からOPはブロッキングに接続するコールを気にするだけです" *はい、これは私が望むものです。 * "@ OPなぜならBlockExとBlockExを混在させたり、IOCPを使用してブロックすることはできません。 – user6088487

答えて

4

はい、問題ありません。
WSAConnectを呼び出すと、接続が作成されるか、エラーが発生するまでスレッドがブロックされます。非同期IOを実行して、アプリケーションIOCPで完了したパケットに関する通知を受け取ることができます。 IOCPはWSAConnectに関するパケットを与えません。

もう1つのポイントは、IOCPがオーバーラップIOで激しく動作することです。関数がOVERLAPPED構造体(WSAConnectなど)のメモリ位置を消費しない場合、IOCPがそのAPI呼び出しを処理しないことを確認できます。たとえOVERLAPPEDが提供されたとしても、それはアクションが非同期であり、IOCPで公開されることを意味しません。

Cの場合はBoost.Asio、Cの場合はlibuvをご覧になりたい場合は、コードを移植しても問題ありません。別のintrestingプラットフォームはマイクロソフトCasablancaですが、これはクロスプラットフォームですが、私の経験ではパフォーマンスは致命的です。

+0

* "OVERLAPPEDが指定されていても、そのアクションが非同期であり、IOCPに公開されるわけではありません" *あなたがステートメント。たとえば、 'WSARecv()'を呼び出してそれを 'OVERLAPPED'構造体に渡し、完了パケットを受け取らないことを意味しますか?たとえば、 – user6088487

+0

の場合、 'ReadFile'と' WriteFile'は 'OVERLAPPED'を取得します。これは読み込みを開始するファイルのオフセットを指定します。ファイルハンドルが非同期アクション用に開かれていない場合、そのアクションは同期して完了します。 –

+0

また、IOパケットを受け取るためには、ハンドルをIOCPに明示的に関連付ける必要があります。したがって、IOCPを取得するには、次の条件が必要であると結論してください。1)非同期IOをサポートするハンドルを持つ2)ハンドルをIOCPに関連付ける3) 'OVERLAPPED'構造体を消費する関数を使用する。いずれかの条件が当てはまらない場合、IOCPはその関数のために起動しません。 –

関連する問題