WSASendWSARecvを使ってオーバーラップドIOを行うときの話です。

  • オーバーラップドIOでは、IO(送受信)が完了するまでシステムがバッファを掴んでいる、つまりそれまでバッファを解放してはいけない
  • WSASendやWSARecvはそのバッファの渡し方として、WSABUFの配列へのポインタ(と要素数)を引数に取る(writevやreadvと同じく複数バッファを指定するため)

さて、オーバーラップドIOの場合、そのWSABUF配列もIOが完了するまで保持しないといけないのでしょうか?という疑問がわきます。

正解は、「その必要はありません」です。MSDNライブラリでWSASendやWSARecvを引けばその旨が書いてあります。

If this function is completed in an overlapped manner, it is the Winsock service provider’s responsibility to capture the WSABUF structures before returning from this call. This enables applications to build stack-based WSABUF arrays pointed to by the lpBuffers parameter.

WSABUF(やその配列)はスタック上の配列を渡して大丈夫だと書いてありますね。つまり、普通の自動変数として作ったものを渡して問題ありません。

ついつい忘れそうになるのでここにメモしておきます。

ところで、このWSABUF、Unix系のiovecとメンバの順番が逆なのがちょっと注意です。と言っても、滅多に困ることはないと思いますが。

スポンサード リンク

この記事のカテゴリ

  • ⇒ オーバーラップドIOとWSABUFの引数