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

[戻る]
snow 2002/10/09(水) 10:56:07
Solaris
C言語

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

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

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

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

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

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

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

dairygoods 2002/10/09(水) 13:22:32
サーバーがacceptしない限り、クライアント側のconnectは成功しないはずですが。

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

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

snow 2002/10/09(水) 13:41:36
>dairygoods 

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

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

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

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

tetsu 2002/10/09(水) 16:49:49
TETSUです。

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

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

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

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

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