2008.02.14 V1.0.2
1.GetChunkedBody, GetNonChunkedBody, IsChunkedメソッド(protected)追加
Transfer-Encoding:chunkedのデータも受信できるようにしました。
公開URLはページの→側にもありますが、
http://winter-tail.sakura.ne.jp
です。
良かったらクリックお願いします→

Transfer-Encoding:chunkedのデータも受信できるようにしました。
日 | 月 | 火 | 水 | 木 | 金 | 土 |
---|---|---|---|---|---|---|
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 |
動かしていたのですが、GET処理をループで連続取得すると、必ず
254回めで「_fdopen error:: Too many open files」が出てしまいます。
HttpURLConnectionクラスをnewしてdeleteするようにし、ループさせた
のですが、やはり同じ回数でエラーがでてしまいました。
何かいい対処法はありますでしょうか?
SocketStream.cpp
で以下の変更を加えて見て下さい。
●SocketStream::Openメソッド
〜〜〜〜〜〜〜〜〜
/* del 20100509
m_fpRead = _fdopen(sock_osfhandle, "r");
if( !m_fpRead ) {
perror("_fdopen error1:");
throw -1;
}
*/
//mod 20100509 start
//m_fpWrite = _fdopen(sock_osfhandle, "w");
m_fpWrite = _fdopen(sock_osfhandle, "w+");
//mod 20100509 end
if( !m_fpWrite ) {
perror("_fdopen error2:");
throw -1;
}
//add 20100509 start
m_fpRead = m_fpWrite;
//add 20100509 end
〜〜〜〜〜〜〜〜〜
●string SocketStream::GetLine(bool)メソッド
※こちらは今回の件には関係ないですが、既存の初期化漏れに対する修正です。
〜〜〜〜〜〜〜〜〜
for(;;) {
//add 20100509 start
memset(buf, 0, sizeof(buf));
//add 20100509 end
fgets(buf,sizeof(buf),m_fpRead);
〜〜〜〜〜〜〜〜〜
=====================
add:追加
del:削除
mod:既存処理を変更
早速修正し、エラーがなくなりました。
ありがとうございました!
でさらに、以下の変更を加えて見て下さい。(派生先のハンドルをクローズをするようにします)。一応3000回まで確認しました。
●SocketStream::Closeメソッド
〜〜〜〜〜〜〜〜〜
int SocketStream::Close() {
//このCloseにより以下が自動的に閉じます。
//・m_fpRead
//・m_fpWrite
//・_open_osfhandleで得たハンドル(Winのみ)
//return m_pclSocket->Close();
return fclose(m_fpRead);
}
〜〜〜〜〜〜〜〜〜
3000回は越えましたが、3900回付近でSocket::Connect()内connectがエラーとなり、WSAENOBUFS(10055)「No buffer space available.」が発生しました。
タスクマネージャで見ると、ハンドル数は、エラーが起きた時に7900個くらいになっていました。
「5000 を超える番号の TCP ポートから接続しようとすると 'WSAENOBUFS (10055)' エラーが表示される」
http://support.microsoft.com/kb/Q196271
というWindowsの制限に関係していると思われます。
netstatでクライアント側のポート番号を確認しながら実行すると、最後に接続できたのが4999番だったので、ほぼ間違いないかと。
実際の利用方法によりますが、この制限は短時間に連続で、リクエストをサーバーへ送信する場合へのものなので、リクエスト→サーバーへのリクエストが、瞬間的に大量に送られるようなことがなければ特に気にしなくても大丈夫なものです。
※一度使用したポート番号は30秒(3分?)ぐらいすると、また使えるようになるので。