1

それぞれがループで実行される 2 つのスレッドを持つソケット サーバーを作成しています。1 つ目は新しい接続を探し、2 つ目は既に接続されているソケットからデータを読み取り、それらに応答します。問題は2番目のものです。'write' 関数は何らかの形でループを破り、プログラムを終了させます...エラーは発生しません...それが問題です。

次のコードは、2 番目のスレッドの関数です。ソケットに何も書き込まなければ、プログラムはうまく動作します

void* SocketServer::threadSocketsRead( void* thisServer )
{
    SocketServer*               server; 
    int                         key,
                                playersNumber,
                                requestLength;
    Player*                     player;
    char                        message[256];
    string                      reply;

    server = (SocketServer*)thisServer;

    while ( 1 )
    {
        playersNumber = server->players.size();
        for ( key = 0 ; key < playersNumber ; key ++ )
        {
            player = server->players[key];  
            requestLength = read ( player->socket , (void*)&message , 255 );
            if ( requestLength < 0 )
            {
                perror ( "read" );
            }
            else
            {
                /*
                    If I uncomment the line, it will write data to
                    the socket and finish the whole program.

                    If I do no uncomment it, the programs runs in a loop further.
                */

                //int result = write ( player->socket , "reply\0" , 6 );
            };
        }
        sleep(1);
    }
}
4

1 に答える 1

3

おそらくデッド ソケットに書き込みを行っており、SIGPIPEwho のデフォルト アクションはプログラムの終了です。あなたはできる:

  • SIGPIPE を処理する
  • 渡すMSG_NOSIGNAL_send(2)
  • SO_NOSIGPIPEを使用して設定しsetsockoptます(移植性はありません)
于 2012-08-07T07:46:50.200 に答える