わいえむねっと

Contents
Categories
Calendar
2005/09
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30
Monthly Archives
~2000/01
Recent Entries
RSS1.0
Templates
Information
Processed: 0.059 sec
Chashed: -
2005/09/15 Thu
freadで9000byteほど読もうとしているのにどうも途中で切れるらしい。
バッファサイズを10000から15000にしてみたら普通に全部読めたらしい。
「なんでやねん」
色々試してみたが、どうもバッファサイズが12287以下だと読み込みサイズが8192に丸められているらしい。同様に8191以下だと4096に。
「なんでやねん」
あと上の結果はVC7であって、BCB5では特に丸められることもなく。
「なんでやねん」 WSAIoctlのSIO_KEEPALIVE_VALSを使えばレジストリを書き換えずにKeepAliveが使用できるばかりかソケット単位で監視周期の設定が可能だというのに、MSDNライブラリはtcp_keepalive構造体の定義を載せるのみでろくな説明がないのでとりあえず試して備忘録。

struct tcp_keepalive {
u_long onoff;
u_long keepalivetime;
u_long keepaliveinterval;
};

onoffがu_longなのがよくわかりませんが、1で有効、0で無効になることは確認。MSTcpIp.hを覗いてみたが特にdefineは切られていない模様。
keepalivetimeとkeepaliveintervalに関してはレジストリに設定する場合と同様か。TcpMaxDataRetransmissionsに該当する項目はありませんね。
あとは対象ソケットとSIO_KEEPALIVE_VALSを指定してlpvInBufferにtcp_keepaliveのポインタ、cbInBufferにsizeof(tcp_keepalive)を渡すだけと。
まぁ、今回のシステムではkeepaliveを使わないと明言されているから関係ないんですけど。
http://msdn.micro​soft.com/library/default.as​p?url=/library/en-us/winsock/winsock/wsaioctl_2​.asp