ソケット通信について – プログラミング – Home

通知
すべてクリア

[解決済] ソケット通信について


TY
 TY
(@TY)
ゲスト
結合: 21年前
投稿: 16
Topic starter  

現在ソケットのプログラムを作成しているのですが、
解らない点がありますので、教えてください。

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

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

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

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

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

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


引用未解決
トピックタグ
ハリィ
 ハリィ
(@ハリィ)
ゲスト
結合: 22年前
投稿: 14
 

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


返信引用
TY
 TY
(@TY)
ゲスト
結合: 21年前
投稿: 16
Topic starter  

早々の回答ありがとうございます。

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

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

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


返信引用
ハリィ
 ハリィ
(@ハリィ)
ゲスト
結合: 22年前
投稿: 14
 

> Accept関数を実行しないという事でしょうか?
そうです。OnAccept はあくまで「接続要求来たよ」って教えてくれるだけで、何も Accept
関数を呼べという命令ではありません。

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


返信引用
TY
 TY
(@TY)
ゲスト
結合: 21年前
投稿: 16
Topic starter  

またまたありがとうございます。

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

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

もう一点御願いします。

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

よろしく御願いします。


返信引用
ハリィ
 ハリィ
(@ハリィ)
ゲスト
結合: 22年前
投稿: 14
 

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

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

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


返信引用
TY
 TY
(@TY)
ゲスト
結合: 21年前
投稿: 16
Topic starter  

ありがとうございました。

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました