2008年02月14日

更新しました(HttpURLConnectionクラス)

WebサービスのRESTクライアントクラス作成に伴う機能追加です。

2008.02.14 V1.0.2
1.GetChunkedBody, GetNonChunkedBody, IsChunkedメソッド(protected)追加
Transfer-Encoding:chunkedのデータも受信できるようにしました。


公開URLはページの→側にもありますが、
http://winter-tail.sakura.ne.jp
です。

良かったらクリックお願いします→banner_01.gif
posted by 台北猫々 at 19:57| Comment(8) | TrackBack(0) | 日記
この記事へのコメント
台北猫々LIBを使わせて頂こうと、HttpURLConnectionのサンプルを
動かしていたのですが、GET処理をループで連続取得すると、必ず
254回めで「_fdopen error:: Too many open files」が出てしまいます。

HttpURLConnectionクラスをnewしてdeleteするようにし、ループさせた
のですが、やはり同じ回数でエラーがでてしまいました。

何かいい対処法はありますでしょうか?
Posted by かわうそ at 2010年05月06日 15:23
ごめんなさい。ソケットストリームのクローズが上手くいかずに、どんどん滞留してしまっているようです。何か対処方法を調べてみます。

Posted by 台北猫々 at 2010年05月08日 01:08
とりあえず対応ですが、、、

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:既存処理を変更
Posted by 台北猫々 at 2010年05月09日 21:01
迅速な対応ありがとうございます。
早速修正し、エラーがなくなりました。
ありがとうございました!
Posted by かわうそ at 2010年05月10日 13:12
254回目はとりあえずクリアしていたのですが、今度は509回目で「_fdopen error:: Too many open files」が出ることがわかりました。
Posted by かわうそ at 2010年05月14日 09:23
SocketStream.cpp
でさらに、以下の変更を加えて見て下さい。(派生先のハンドルをクローズをするようにします)。一応3000回まで確認しました。

●SocketStream::Closeメソッド
〜〜〜〜〜〜〜〜〜
int SocketStream::Close() {
//このCloseにより以下が自動的に閉じます。
//・m_fpRead
//・m_fpWrite
//・_open_osfhandleで得たハンドル(Winのみ)
//return m_pclSocket->Close();
return fclose(m_fpRead);
}
〜〜〜〜〜〜〜〜〜
Posted by 台北猫々 at 2010年05月16日 08:19
試してみました。

3000回は越えましたが、3900回付近でSocket::Connect()内connectがエラーとなり、WSAENOBUFS(10055)「No buffer space available.」が発生しました。
タスクマネージャで見ると、ハンドル数は、エラーが起きた時に7900個くらいになっていました。
Posted by かわうそ at 2010年05月21日 10:33
どうもこれは、

「5000 を超える番号の TCP ポートから接続しようとすると 'WSAENOBUFS (10055)' エラーが表示される」
http://support.microsoft.com/kb/Q196271

というWindowsの制限に関係していると思われます。

netstatでクライアント側のポート番号を確認しながら実行すると、最後に接続できたのが4999番だったので、ほぼ間違いないかと。

実際の利用方法によりますが、この制限は短時間に連続で、リクエストをサーバーへ送信する場合へのものなので、リクエスト→サーバーへのリクエストが、瞬間的に大量に送られるようなことがなければ特に気にしなくても大丈夫なものです。

※一度使用したポート番号は30秒(3分?)ぐらいすると、また使えるようになるので。
Posted by 台北猫々 at 2010年05月22日 23:25
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/10894045

この記事へのトラックバック