1

こんばんは。最近、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宣言されているため、関数が役に立たなくなります。数字、それは私の側のばかげたエラーでした。staticbind

しかし、ここで別の質問があります - コンストラクターがそこで 2 回呼び出されたのはなぜですか? ヘッダーのコードは次のようになります。

#ifndef __BLAH_H__
#define __BLAH_H__

class ServerSocket
{
    //some code
}
static ServerSocket CServerObj;

#endif // __BLAH_H__

variable がヘッダーファイルで宣言されたことが原因である可能性があると思います...しかし、#ifndef2番目の宣言から保護するべきではありませんか?

4

0 に答える 0