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