はじめまして。
「64 ソケット」制限について調べています。
グーグルでは以下検索結果でいろいろと記事を読んでいます。
http://www.google.co.jp/search?hl=ja&q=64+%E3%82%BD%E3%82%B1%E3%83%83%E3%83%88%
E3%80%80%E5%88%B6%E9%99%90%E3%80%80winsock&lr=lang_ja
ここのラウンジの過去ログでは以下の記事を見つけました。
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200606/06060102.txt
単一スレッドでは64以上のソケットを張ることができないようですが、上記記事には
以下の記述がありました。
>WSAEventSelect や select を使う場合は制限があると書いてあります。
私は現在、CAsyncSocket(非同期ソケット)を使って単一スレッドで通信モジュールを作
成しており、このモジュールが64ソケット以上でエラーが出てしまうのかどうか調べて
います。WSAEventSelectやWaitForMultipleObjectsは使用していません。
ためしに300ソケット作成し、通信テストを実施してみたのですが、問題なくできまし
た。
テスト環境は以下です。
○開発
Vista, VisualStudio 2008,VC++
○テスト環境:クライアント側
Vista
○テスト環境:サーバ側
XP sp2
○テスト内容
1.ソケットの接続(300パス)
結果:OK
2.クライアントからサーバへのデータ送信
(パス毎に2kバイト送信)
結果:OK
3.クライアント側での全ソケットクローズ
結果:サーバ側で全ソケットクローズを検出OK
結果から見た限りでは問題なさそうですが、実際のところどうなんでしょうか。
別ケースでエラーが発生するケースなどないでしょうか。
WSAEventSelectなどはPG上では使っていませんが、CAsyncSocketが内部的に使っていた
りすると64制限が問題になりそうな気もします。
CAsyncSocketを使ってWSAEventSelectなどを使わずにPGした場合は64ソケットの制限は
ないと考えてもよろしいでしょうか。
よろしくお願いしますm(__)m
>WSAEventSelectなどはPG上では使っていませんが、CAsyncSocketが内部的に使っていた
>りすると64制限が問題になりそうな気もします。
>CAsyncSocketを使ってWSAEventSelectなどを使わずにPGした場合は64ソケットの制限は
>ないと考えてもよろしいでしょうか。
CAsyncSocketのソースを確認した方がよろしいかと。
VisualStudio 2005のCAsyncSocketのソースを確認してみましたが、64ソケットの問題に
なるAPIは使用されていないようです。
1カ所でselect()が使われていましたが、fd_set構造体は1つしか使用していませんでしたし。
ただし、他のバージョンのMFCでもそうなっている。という保証はありません。
# WSAAsyncSelect()でFD_READ受けた後、select()処理していますな…。
# この方が安全なんだろうか??
# まぁ、メッセージキューに入った後でのshutdown()対策…かなぁ。
# 私のがたまに死ぬのはこのせいか?(SSL絡みっぽいんだけど)
瀬戸っぷ様
ご回答、ありがとうございました。
確かに、CAsyncSocketのソースを見ると使ってなさそうですね。
テストの結果を見た限りでも64ソケットの制限には引っかかって無さそうですし。
ひとまず問題なさそうということで現在の構成で継続使用してみたいと思います。
どうもありがとうございました。