Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;螺纹+;网络,一旦我引入线程,accept就会失败 我试图实现一个小型的C++服务器。我希望接收来自客户端的连接,并在自己的线程中处理所有这些连接。到现在为止,一直都还不错。只要我不引入线程,它就可以正常工作,但只要我尝试为客户机创建一个线程,就会接受带有-1/error的返回_C++_Multithreading_Networking - Fatal编程技术网

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
创建客户机对象,并将线程a
shared_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) );