ソケット通信について

[戻る]
TY 2003/12/09(火) 18:12:30
現在ソケットのプログラムを作成しているのですが、
解らない点がありますので、教えてください。

VC6.0SP5でCAsyncSocketを使用してサーバー(TCP)
のプログラムを作成しています。

1対1の動作には、問題ありませんが、
複数のクライアントからの動作がうまく出来ません。

1対1でしか動作しないようにする場合、
どうしたらよいのでしょうか。

OnAcceptイベントが発生した後どのようにすればよいのでしょうか?

私のイメージとしては、1つのクライアントが接続している時
は、他のクライアントは、オープンできないようにする事が目的です。

説明不足かも知れませんがよろしく御願いします。

ハリィ 2003/12/09(火) 19:06:56
1つ目の接続を Accept したらフラグを立て、それ以降は Accept しない。
もしくは Accept してすぐ ShutDown,Close 動作を行うようにする。
もしくはいっそのこと Listen しているサーバソケットを ShutDown, Close してしまう。
ソケットの構造上、ひとつしか受け取らない、という設定は難しいので、これら3つのうち
のどれかを使ってみてください。

TY 2003/12/11(木) 16:19:39
早々の回答ありがとうございます。

まだわからない点があるので、教えてください。

”1つ目の接続を Accept したらフラグを立て、それ以降は Accept しない。”
ですが、Acceptしないという事ですが、
2つ目がオープンすると、OnAcceptイベントが発生してしまいます。
イベントが発生しないようにする方法があるのでしょうか?

Accept関数を実行しないという事でしょうか?
実行しなければ、1つ目が一旦クローズし、再度オープンしたら
オープンに失敗してしまいます。(OnAcceptイベントも発生しません)

ハリィ 2003/12/11(木) 17:42:07
> Accept関数を実行しないという事でしょうか?
そうです。OnAccept はあくまで「接続要求来たよ」って教えてくれるだけで、何も Accept
関数を呼べという命令ではありません。

> 実行しなければ、1つ目が一旦クローズし、再度オープンしたら
> オープンに失敗してしまいます。(OnAcceptイベントも発生しません)
う、確かにそうですね。Accept しなければ接続要求がキューに溜まってしまって、それ以降
を受け取れないですね。
そうなると、フラグが立っている間は OnAccept で Accept, ShutDown, Close 動作をして
接続要求を片っ端から閉じるしかないように思います。

TY 2003/12/12(金) 09:52:46
またまたありがとうございます。

Accept, ShutDown, Close の方法でいきたいと思います。

余談になりますが、
”ソケットの構造上、ひとつしか受け取らない、という設定は難しいので、”
と回答いただきましたが、プログラムが難しくなるという事
ではなく、構造上なのでしょうか?
もし、プログラムが難しくなるのならば、ドライバレベルで何とか
しないのでしょうか?

もう一点御願いします。

Listen関数ですが、引数に値を入れなければ
既定値の5になるようですが、
これを1にしたら、クライアントが1台しかつなげないという事でしょうか?
それとも1つだけキューが溜まるという事なのでしょうか?

よろしく御願いします。

ハリィ 2003/12/12(金) 10:45:05
> と回答いただきましたが、プログラムが難しくなるという事
> ではなく、構造上なのでしょうか?
構造上です。
サーバソケットは受け付け窓口みたいなもので、ソケットを Accept したらまた Listen 状態
に戻ります。Accept してクライアントと結び付けられたソケットは、サーバソケットとはも
はやまったく関係がありません。よって、「ひとつだけの接続を受け取る」というような
サーバは難しいのです(難しいといっても、方法はありますからどうとでもなるレベルですが)。

> もし、プログラムが難しくなるのならば、ドライバレベルで何とか
> しないのでしょうか?
そんな事したら、既に TCP/IP じゃなくなってるような…。
サーバは 1〜n のクライアントからの接続を前提として設計されています。もし 1 のクライアント
しか前提としてなかったら、複数の接続をしたい時にとっても面倒です。
それにドライバを操作するくらいなら、サーバソケットを閉じたほうが賢明だと思いますが…。

> Listen関数ですが、引数に値を入れなければ
> 既定値の5になるようですが、
> これを1にしたら、クライアントが1台しかつなげないという事でしょうか?
> それとも1つだけキューが溜まるという事なのでしょうか?
クライアントの接続要求を Accept しないと、待ち受けキューに入れられて Accept まで
待ちます。そのキューに入る個数が Listen メンバ関数の引数なので、答えは後者です。

TY 2003/12/12(金) 13:15:37
[[解決]]
ありがとうございました。

前回書いた通り、Accept, ShutDown, Close で行います。

古いスレッドには追加発言できません。