こんばんは。最近、TCP/IP で自分のスキルを試すことにしたので、現在、ソケットを使用してある種のサーバー/クライアント チャットを作成しようとしています。
私が聞きたかったのは、対話スレッドとソケットです。具体的には、accept() 関数に興味があります。調べてみましたが、似たような状況はなかなか見つかりませんでした。
したがって、問題は、スレッドの外側でソケットを受け入れようとしているときに、完全に機能することです。逆に、スレッド内で使用すると、その呼び出しは無視されます。
したがって、accept関数を呼び出すメソッドは次のとおりです。
void ServerSocket::Accept( void )
{
sockaddr_in saClientAddr;
int nCliSize = sizeof( sockaddr_in );
sClient = accept( sSocket, (sockaddr*)&saClientAddr, &nCliSize );
if( sClient == INVALID_SOCKET )
{
GetError();
return;
}
}
したがって、次の方法で使用します。
CServerObj.Accept();
それは完全に機能し、サーバーはクライアントからの入力を待ってから再開します。ただし、スレッド内で使用する場合:
unsigned __stdcall ServerThread( void* Param )
{
while( true )
{
CServerObj.Accept();
}
return 0;
}
そしてスレッドを開始します:
_beginthreadex( 0, 0, &ServerThread, 0, 0, NULL );
その後、accept() は毎回無視され、プログラムはエラーについて通知する無限ループに入ります (GetError メソッド)。
だから、私はこの状況にちょっと混乱しています。これは、スレッド呼び出しが非同期であるため、クライアントの応答を待たないためですか?
とにかく、誰かが私が間違ったことを説明してくれたらありがたいです。
それで、試行錯誤の末、この奇妙な動作の背後にある理由を突き止めました。のように見えますが、コンストラクターが 2 回呼び出されるとCServerObj
宣言されているため、関数が役に立たなくなります。数字、それは私の側のばかげたエラーでした。static
bind
しかし、ここで別の質問があります - コンストラクターがそこで 2 回呼び出されたのはなぜですか? ヘッダーのコードは次のようになります。
#ifndef __BLAH_H__
#define __BLAH_H__
class ServerSocket
{
//some code
}
static ServerSocket CServerObj;
#endif // __BLAH_H__
variable がヘッダーファイルで宣言されたことが原因である可能性があると思います...しかし、#ifndef
2番目の宣言から保護するべきではありませんか?