2008年01月12日

ソケットの高水準入出力

昨日公開しましたSocketStreamクラスですが、機能としてはソケットの対して、fgetsやfputsのような高水準仕様での入出力を可能にします。

Linuxだとソケット記述子をfdopenするだけなのですが、Windowsの場合は、工夫が必要で、

ソケットを作成する前に、
int sockopt = SO_SYNCHRONOUS_NONALERT;
setsockopt(INVALID_SOCKET, SOL_SOCKET, SO_OPENTYPE, (char *)&sockopt, sizeof(sockopt));
を行って、

さらに作成したソケットハンドルについて
int sock_osfhandle = _open_osfhandle(socket, _O_RDONLY);
を行ってファイルハンドルに変換してからfdopenしなければなりません。

この辺は、Rubyのソースなどを参考にして組んでみましたが、setsockopt関数の"OPENTYPE"や"SO_SYNCHRONOUS_NONALERT"は、MSDNを見ると非推奨のようなことが書いてあるのですよね。。。まあ、モウマンタイでしょう。
posted by 台北猫々 at 21:14| Comment(0) | TrackBack(0) | 技術メモ(Windows C/C++)