現在ソケットのプログラムを作成しているのですが、
解らない点がありますので、教えてください。
VC6.0SP5でCAsyncSocketを使用してサーバー(TCP)
のプログラムを作成しています。
1対1の動作には、問題ありませんが、
複数のクライアントからの動作がうまく出来ません。
1対1でしか動作しないようにする場合、
どうしたらよいのでしょうか。
OnAcceptイベントが発生した後どのようにすればよいのでしょうか?
私のイメージとしては、1つのクライアントが接続している時
は、他のクライアントは、オープンできないようにする事が目的です。
説明不足かも知れませんがよろしく御願いします。
1つ目の接続を Accept したらフラグを立て、それ以降は Accept しない。
もしくは Accept してすぐ ShutDown,Close 動作を行うようにする。
もしくはいっそのこと Listen しているサーバソケットを ShutDown, Close してしまう。
ソケットの構造上、ひとつしか受け取らない、という設定は難しいので、これら3つのうち
のどれかを使ってみてください。
早々の回答ありがとうございます。
まだわからない点があるので、教えてください。
”1つ目の接続を Accept したらフラグを立て、それ以降は Accept しない。”
ですが、Acceptしないという事ですが、
2つ目がオープンすると、OnAcceptイベントが発生してしまいます。
イベントが発生しないようにする方法があるのでしょうか?
Accept関数を実行しないという事でしょうか?
実行しなければ、1つ目が一旦クローズし、再度オープンしたら
オープンに失敗してしまいます。(OnAcceptイベントも発生しません)
> Accept関数を実行しないという事でしょうか?
そうです。OnAccept はあくまで「接続要求来たよ」って教えてくれるだけで、何も Accept
関数を呼べという命令ではありません。
> 実行しなければ、1つ目が一旦クローズし、再度オープンしたら
> オープンに失敗してしまいます。(OnAcceptイベントも発生しません)
う、確かにそうですね。Accept しなければ接続要求がキューに溜まってしまって、それ以降
を受け取れないですね。
そうなると、フラグが立っている間は OnAccept で Accept, ShutDown, Close 動作をして
接続要求を片っ端から閉じるしかないように思います。
またまたありがとうございます。
Accept, ShutDown, Close の方法でいきたいと思います。
余談になりますが、
”ソケットの構造上、ひとつしか受け取らない、という設定は難しいので、”
と回答いただきましたが、プログラムが難しくなるという事
ではなく、構造上なのでしょうか?
もし、プログラムが難しくなるのならば、ドライバレベルで何とか
しないのでしょうか?
もう一点御願いします。
Listen関数ですが、引数に値を入れなければ
既定値の5になるようですが、
これを1にしたら、クライアントが1台しかつなげないという事でしょうか?
それとも1つだけキューが溜まるという事なのでしょうか?
よろしく御願いします。
> と回答いただきましたが、プログラムが難しくなるという事
> ではなく、構造上なのでしょうか?
構造上です。
サーバソケットは受け付け窓口みたいなもので、ソケットを Accept したらまた Listen 状態
に戻ります。Accept してクライアントと結び付けられたソケットは、サーバソケットとはも
はやまったく関係がありません。よって、「ひとつだけの接続を受け取る」というような
サーバは難しいのです(難しいといっても、方法はありますからどうとでもなるレベルですが)。
> もし、プログラムが難しくなるのならば、ドライバレベルで何とか
> しないのでしょうか?
そんな事したら、既に TCP/IP じゃなくなってるような…。
サーバは 1~n のクライアントからの接続を前提として設計されています。もし 1 のクライアント
しか前提としてなかったら、複数の接続をしたい時にとっても面倒です。
それにドライバを操作するくらいなら、サーバソケットを閉じたほうが賢明だと思いますが…。
> Listen関数ですが、引数に値を入れなければ
> 既定値の5になるようですが、
> これを1にしたら、クライアントが1台しかつなげないという事でしょうか?
> それとも1つだけキューが溜まるという事なのでしょうか?
クライアントの接続要求を Accept しないと、待ち受けキューに入れられて Accept まで
待ちます。そのキューに入る個数が Listen メンバ関数の引数なので、答えは後者です。
ありがとうございました。
前回書いた通り、Accept, ShutDown, Close で行います。