Boost接受器每次接受两次输入连接,并生成两个线程



我在TCP服务器上工作,使用boost库实现TCP和套接字功能。我还使用boost进行线程处理。服务器可以工作,但当我将客户端连接到服务器时,服务器会创建两个线程,而不是一个线程。在接受连接后,我有一个控制台打印,每次连接都会看到两次打印行。对于每个连接,都会创建一个新的线程,其中包含一个处理连接的函数。我制作了一个类GlobalControll,用于设置服务器和处理连接。我的问题是为什么每个连接要创建两个线程?因为它应该在使用accept函数之后等待新的连接。

Bellow是我认为问题发生的构造函数。

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;
       }
    };

如果有人能帮我或给我一个关于这个问题的提示,那就太好了!非常感谢。

发现问题。没有以正确的方式将客户端套接字连接到服务器套接字。服务器的代码(在这个线程中)不是问题所在。在客户端以一种奇怪的方式调用了connect函数两次。

解决了在解析服务器套接字后只调用connect的问题,如下所示:(解析服务器套接字的代码已提交)。

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

谢谢大家的评论。

最新更新