環境:VC++ 2008 SP1
Windows Vista ビジネス
マルチコアCPU
現在、CSocketによる通信プログラムを書いています。
目的としてはCSocket,CArchive,CSocketFileによるアーカイブ通信で、CObjectより派生
したデータ保持クラスをシリアライズしてクライアントサーバモデルにて相互通信、と
なっています。
そこで疑問がありまして、王道として「ソケット毎にスレッドは必要なのか」という事で
す。
ソケット毎にスレッドを持たせると、あるクライアントからのデータの方が先に着信して
も
処理の如何によっては、別のクライアントからのデータの方が優先されてしまわないか
な、と思います。
ならば1つのスレッドに対して、複数のソケットがぶらさがるだけでいいのでは無いのか
な、と。
後、VC++にて確認したところ、CSocketにConnect(またはListen)した所、スレッドが一つ
増えています。
これが内部的な「送受信スレッド」であれば、ますます自分でスレッドを用意する必要は
無いのでは?と思います。
・ソケット毎にスレッドは必要なのか
・スレッドを用意した場合、データ着信の前後は起こらないのか
・CSocket(CAsyncSocket)は内部でスレッドを起こしているのか
上記、ご存知の方がいらっしゃればご教授願えませんか?
宜しくお願いします。
・ソケット毎にスレッドは必要なのか
→ 仕様によります。
・スレッドを用意した場合、データ着信の前後は起こらないのか
→ 前後を起こさないようにコードできます。好きにしましょう。
・CSocket(CAsyncSocket)は内部でスレッドを起こしているのか
→ 知りません。というか興味ありません。
自分としては、ソケットについて言うならば、
「CSocketは使わないのが王道」と考えています。
ただし、おもちゃとして遊んでみるのは良いでしょう。
ちゃんとしたバークレーコードで書けるのに、わざわざ
危ないCSocktを使う必要は無いように思います。
特に実用品への使用は避けたほうが無難だと考えます。
参考「Winsock Programmer's FAQ」
http://www.kt.rim.or.jp/~ksk/wskfaq-ja/
「なぜCSocketは有害か?」
http://www.kt.rim.or.jp/~ksk/wskfaq-ja/articles/csocket.html
仲澤@失業者 様、レスポンス有難うございます。
>・ソケット毎にスレッドは必要なのか
> → 仕様によります。
確かにおっしゃる通りです。
>・スレッドを用意した場合、データ着信の前後は起こらないのか
> → 前後を起こさないようにコードできます。好きにしましょう。
現在、接続先分のソケットを用意し、OnReceiveにて受信。
受信後、データ配信スレッドへとポスト、さらにデータ処理スレッドへ振り分け、と考え
ています。
1スレッドでは着信した分からReceiveすれば、データの前後は起こり得ないと思いますが
ソケット分スレッドを起動した場合、受信処理が重い場合(データサイズが大きい等)
データを配信するスレッドに、後から着信したデータの方が先にPostされる可能性もある
のではないかな?と思っています。
前後を起こさない方法、というのが思い浮かびませんが
当面の間は「ソケットで読んだ事を着信」とするのではなく
「データ配信スレッドに届いた事を着信」と考えようと思います。
これならばデータの前後は起こらないと思いますので。
>・CSocket(CAsyncSocket)は内部でスレッドを起こしているのか
> → 知りません。というか興味ありません。
そうですか、わかりました。ありがとうございます。
方針は決まったのですが、今夜一日だけ解決は待ってみようと思います。
引き続き宜しくお願いします。
書き損じてました。
>>仲澤@失業者 様
>自分としては、ソケットについて言うならば、
>「CSocketは使わないのが王道」と考えています。
参考アドレス有難うございます。
CSocketについての色々な問題は耳にしてはいるのですが
今回の目標が、アーカイブを使用したCSocketの通信なので
鞍替えは少し…。
アーカイブ通信によって、自分で書くコードを減らそう、というのが目的でもありますの
で。
おはようございます。
結局、ソケット毎にスレッドを持たせて
データ配信スレッドに届いた事を着信という考えで進めていく事にしました。
仲澤@失業者 様、当トピックを見てくださった皆様、ありがとうございました。
以上です。
>アーカイブ通信によって、自分で書くコードを減らそう、というのが目的でもあります
の
>で。
紹介したページにあるように、そもそもCSocketが使えない理由は
CObjectから派生させてしまったことによるものであります。
つまり、CArchiveとCObjectが前提としている機能を優先するあまり、
本来の通信に必要な機能を粗略に扱ってしまったわけです。
自分としては、先人の失敗に学ぶべきところは学んだほうが良いと考えます。
仲澤@失業者 様、度々有難うございます。
ソースコードを読み進めていくうちに、CWndから派生していない所為で
現在のスレッドにテンポラリウィンドウを登録して、それを利用してメッセージループを行
う。
といったような処理が見受けられました。
その所為で、CSocketをCreateしたスレッドがどのスレッドかで挙動が変わる(ASSERTが出
る)といった問題にぶちあたりました。
回避策はあるものの、他にも気づいていない「イケてない」箇所があるのでしょう。
仰るとおり、CSocketは複雑怪奇の様です。
自作のアプリはCSocketはやめるとして、勉強としてにCSocketを眺める事にしました。
ご意見有難うございます。