C++;螺纹+;网络,一旦我引入线程,accept就会失败 我试图实现一个小型的C++服务器。我希望接收来自客户端的连接,并在自己的线程中处理所有这些连接。到现在为止,一直都还不错。只要我不引入线程,它就可以正常工作,但只要我尝试为客户机创建一个线程,就会接受带有-1/error的返回
这是我的密码:C++;螺纹+;网络,一旦我引入线程,accept就会失败 我试图实现一个小型的C++服务器。我希望接收来自客户端的连接,并在自己的线程中处理所有这些连接。到现在为止,一直都还不错。只要我不引入线程,它就可以正常工作,但只要我尝试为客户机创建一个线程,就会接受带有-1/error的返回,c++,multithreading,networking,C++,Multithreading,Networking,这是我的密码: void Server::run() { cout << "starting server on port " << this->port << "..." << endl; this->socket_fd = socket(AF_INET, SOCK_STREAM, 0); if (this->socket_fd < 0) { perror("creating socket");
void Server::run()
{
cout << "starting server on port " << this->port << "..." << endl;
this->socket_fd = socket(AF_INET, SOCK_STREAM, 0);
if (this->socket_fd < 0) {
perror("creating socket");
exit(1);
}
struct sockaddr_in myaddr;
myaddr.sin_family = AF_INET;
myaddr.sin_port = htons(this->port);
inet_aton("192.168.201.58", &myaddr.sin_addr);
if ( bind(this->socket_fd, (struct sockaddr*)&myaddr, sizeof(myaddr))) {
perror("bind");
exit(1);
}
if (listen(this->socket_fd, 5)) {
perror("listen");
exit(1);
}
/* waiting for clients */
cout << "waiting for connection..." << endl;
int client_fd;
struct sockaddr_in remote_addr;
socklen_t remote_addr_len;
while (this->running) {
client_fd = accept(this->socket_fd, (struct sockaddr*)&remote_addr, &remote_addr_len);
if (client_fd <= 0) {
perror("accept");
this->running = false;
continue;
}
cout << "got new client with address " << inet_ntoa(remote_addr.sin_addr) << endl;
Client new_client(client_fd, remote_addr.sin_addr);
//new_client.run();
std::thread t ( &Client::run, &new_client );
//t.detach();
}
}
一切正常
如有任何提示,我将不胜感激。请尝试:
std::thread t ( &Client::run, std::move(new_client) );
根据,这就是您应该如何调用它。您正在传递一个线程,该线程包含一个即将超出范围的对象的地址。当线程运行时,
new\u client
可能不再存在。两个明显的解决方案:1)使用make_shared
创建客户机对象,并将线程ashared_ptr
传递给它。2) 通过值向线程传递描述符和地址,并让线程创建客户机对象。感谢您的提示!因此,我将new_client更改为动态分配:while(this->running){client_fd=accept(this->socket_fd,(struct sockaddr*)&remote_addr,&remote_addr_len);if(client_fd running=false;continue;}client*new_client=new client(client_fd,remote_addr.sin_addr)}
并删除了线程。accept仍然存在同样的问题。在每次调用accept
之前,您需要初始化远程添加len
。这就是@DavidSchwartz!谢谢!我想您的意思是std::thread t(&Client::run,std::ref(new_Client))
否则我会出现编译器错误。但无论如何,这两种变体都不能解决问题。线程应该如何处理对不再存在的对象的引用?是的,修复了丢失的(&M)。此外,我非常确定,如果改用std::move,它将解决新的\u客户端超出范围的问题。
std::thread t ( &Client::run, std::move(new_client) );