Solaris
C言語
ソケット通信を行う時に、一つのサーバに対して、一つのクライアントしか
接続できないようにしたいのですが、
サーバ側で、listenした直後に仮に無限ループを行います。
listen( socket, 1 );
while( 1 )
{
}
この時、クライアント側からconnectをすると、複数、接続成功してしてしまいます。
仮につけた無限ループをはずして、
その下の処理は、
struct timeval tm;
fd_set fr;
select( socket+1, &fr, 0, 0, &tm );
となっています。クライアント側で、接続が出来ないことを検知する方法を教えてください。
またサーバ側で、1つのクライアント以外のクライアントを受け付けなくする方法を教えてくだ
さい。お願いします。
サーバーがacceptしない限り、クライアント側のconnectは成功しないはずですが。
while (listen( socket, 1 )==0) {
SOCKET clientSocket = accept(socket, ...);
//通信
}
こうすると、1つのclientSocketと通信している間は、
次をacceptしないので、同時に1台しか繋がりません。
>dairygoods
確かに、データの送受信を行うことは出来ないのですが、
クライアント側のconnectでエラーが返ってこず、処理
が下に落ちてしまいます。
Windowsクライアント
connect(socket, (struct sockaddr *)&addr, sizeof(addr)) == SOCKET_ERROR
Solarisクライアント
connect(socket, (struct sockaddr *)&addr, sizeof(addr)) < 0
このようにconnectをおこなっているのですが、戻りがエラーにならず、コネクトが
完了したことになってしまいます。>dairygoods さんの処理も試しましたがやはり
エラーになりませんでした。
TETSUです。
Solarisは分からないのですが、WINDOWSは、
>このようにconnectをおこなっているのですが、戻りがエラーにならず、コネクトが
>完了したことになってしまいます。>dairygoods さんの処理も試しましたがやはり
ソケットを非同期に設定していると、connect関数ではエラーを検出できないはず
です。ソケットを非同期にしているならばFD_CONNECTのメッセージでタイムアウト
のエラーを検出できたはずです。
その時の環境は ”WIN98SE , WINSOCK2.0 , MFCを使用しない”です。