0

私はTCPサーバーで作業しており、tcpとソケット機能にboostライブラリを使用しています。スレッド化にもブーストを使用しています。サーバーは動作しますが、クライアントをサーバーに接続すると、サーバーは 1 つではなく 2 つのスレッドを作成します。接続を受け入れた直後にコンソール プリントがあり、このプリントラインは接続ごとに 2 回表示されます。接続ごとに、接続を処理する関数を使用して新しいスレッドが作成されます。サーバーをセットアップして接続を処理するクラス GlobalControll を作成しました。私の質問は、接続ごとに 2 つのスレッドが作成される理由です。accept 関数を使用した後、新しい接続を待機する必要があるためです。

ベローは、問題が発生すると思われるコンストラクター関数です。

GlobalControl::GlobalControl(){

cout << "Setting up a server with the default port (" << PORTNUMBER << ")" << endl;

// Protocol and port
 boost::asio::ip::tcp::endpoint endpoint(boost::asio::ip::tcp::v4(), PORTNUMBER);   

 // Create acceptor
 boost::asio::ip::tcp::acceptor acceptor(io_service, endpoint);   

 // Create socket
 boost::asio::ip::tcp::socket socket(io_service); 

 for(;;){

     // Create socket
     SmartSocket sock(new boost::asio::ip::tcp::socket(io_service));

     // Waiting for client
     acceptor.accept(*sock);
     cout << "Client connected" << endl;
     boost::thread t(InitHandler, sock); 
     Sleep(1);
 };  
};

各スレッドが実行する Inithandler 関数は、次の関数です。

    // Global function that each thread wil run
    void InitHandler(SmartSocket sock){

    int result = -1;
    byte RecvData[DataGenerator::SHA256BYTESIZE];
    DataGenerator DatGen;

       try
       {
            bool pending = true;
            while(pending)
           {
            // Generate a new vector
            DatGen.GenerateInputData();

            // Send vector
            boost::asio::write(*sock, boost::asio::buffer(DatGen.digest, sizeof(DatGen.digest)));

            // Make sure that the RecvData variable is clear
            CleanData(RecvData, DataGenerator::SHA256BYTESIZE);

            // Recieve data back from client
            boost::asio::read(*sock, boost::asio::buffer(RecvData, DataGenerator::SHA256BYTESIZE));

            // Compare input vector with recieved data from client
            result = memcmp (DatGen.digest, RecvData, sizeof(DataGenerator::SHA256BYTESIZE));

            if(result != 0){
                cout << "Error found" << endl;
            };


        }
   }
           catch (std::exception& e){
         // std::cout << "Exception in thread: " << e.what() << std::endl;
       }
    };

誰かが私を助けてくれたり、この問題に関するヒントを教えてくれたりしたら、それは素晴らしいことです! よろしくお願いします。

4

1 に答える 1

0

問題が見つかりました。クライアントソケットをサーバーソケットに正しい方法で接続しませんでした。(このスレッドの) サーバーのコードは問題ではありませんでした。クライアントで奇妙な方法で接続関数を 2 回呼び出しました。

サーバーソケットを解決した後に connect を呼び出すだけで問題が解決しました。以下を参照してください (サーバーソケットを解決するコードは省略されています)。

    tcp::socket socket(io_service);
    socket.connect(*iterator);

すべてのコメントをありがとう。

于 2013-07-10T09:12:08.580 に答える