ソケット通信で、1台以上のクライアントを接続できなくする方法について – プログラミング – Home

ソケット通信で、1台以上のクライアント...
 
通知
すべてクリア

ソケット通信で、1台以上のクライアントを接続できなくする方法について


snow
 snow
(@snow)
ゲスト
結合: 23年前
投稿: 30
Topic starter  

Solaris
C言語

ソケット通信を行う時に、一つのサーバに対して、一つのクライアントしか
接続できないようにしたいのですが、

サーバ側で、listenした直後に仮に無限ループを行います。

listen( socket, 1 );
while( 1 )
{
}

この時、クライアント側からconnectをすると、複数、接続成功してしてしまいます。

仮につけた無限ループをはずして、
その下の処理は、

struct timeval tm;
fd_set fr;
select( socket+1, &fr, 0, 0, &tm );

となっています。クライアント側で、接続が出来ないことを検知する方法を教えてください。
またサーバ側で、1つのクライアント以外のクライアントを受け付けなくする方法を教えてくだ
さい。お願いします。


引用解決済
トピックタグ
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

サーバーがacceptしない限り、クライアント側のconnectは成功しないはずですが。

while (listen( socket, 1 )==0) {
SOCKET clientSocket = accept(socket, ...);
//通信
}

こうすると、1つのclientSocketと通信している間は、
次をacceptしないので、同時に1台しか繋がりません。


返信引用
snow
 snow
(@snow)
ゲスト
結合: 23年前
投稿: 30
Topic starter  

>dairygoods

確かに、データの送受信を行うことは出来ないのですが、
クライアント側のconnectでエラーが返ってこず、処理
が下に落ちてしまいます。

Windowsクライアント
connect(socket, (struct sockaddr *)&addr, sizeof(addr)) == SOCKET_ERROR

Solarisクライアント
connect(socket, (struct sockaddr *)&addr, sizeof(addr)) < 0

このようにconnectをおこなっているのですが、戻りがエラーにならず、コネクトが
完了したことになってしまいます。>dairygoods さんの処理も試しましたがやはり
エラーになりませんでした。


返信引用
tetsu
 tetsu
(@tetsu)
ゲスト
結合: 23年前
投稿: 10
 

TETSUです。

Solarisは分からないのですが、WINDOWSは、

>このようにconnectをおこなっているのですが、戻りがエラーにならず、コネクトが
>完了したことになってしまいます。>dairygoods さんの処理も試しましたがやはり

ソケットを非同期に設定していると、connect関数ではエラーを検出できないはず
です。ソケットを非同期にしているならばFD_CONNECTのメッセージでタイムアウト
のエラーを検出できたはずです。

その時の環境は ”WIN98SE , WINSOCK2.0 , MFCを使用しない”です。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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