我正在使用TCP服务器,我正在使用升级库来实现tcp和socket功能。我也使用boost进行线程化。服务器工作,但当我将客户端连接到服务器时,服务器创建两个线程而不是一个。在接受连接之后我有一个控制台打印,每个连接看到这个打印行两次。对于每个连接,将使用处理连接的函数创建新线程。我创建了一个类GlobalControll来设置服务器并处理连接。我的问题是为什么每个连接创建两个线程?因为它应该在接受函数之后等待新的连接。
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;
}
};
如果有人可以帮助我,或者给我一个关于这个问题的小费,那就太好了!非常感谢提前。
答案 0 :(得分:0)
发现问题。没有以正确的方式将客户端套接字连接到服务器套接字。服务器的代码(在这个线程中)不是问题。在客户端中以奇怪的方式将连接函数调用两次。
通过在解析服务器套接字后调用connect来解决问题,请参见下文:(省略了解析服务器套接字的代码)。
tcp::socket socket(io_service);
socket.connect(*iterator);
感谢所有评论。