C ++线程+网络,一旦引入线程

时间:2015-09-25 17:41:41

标签: c++ multithreading networking

我正在尝试实现一个小型的c ++服务器。我想从客户端接收连接,并在自己的线程中处理所有这些连接。到现在为止还挺好。只要我没有引入线程,它工作正常,但只要我尝试为客户端创建一个线程,接受返回-1 /错误。

这是我的代码:

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

当我尝试通过telnet连接时,我得到“接受:无效的参数”。一旦我注释掉我创建线程的行

    std::thread t ( &Client::run, &new_client );

一切正常。

我很感激任何提示。

1 个答案:

答案 0 :(得分:-1)

尝试:

hbox = QtGui.QHBoxLayout(self)

topleft = QtGui.QFrame(self)
topleft.setFrameShape(QtGui.QFrame.StyledPanel)
topleft.setGeometry(0, 0, 300, 0)

topright = QtGui.QFrame(self)
topright.setFrameShape(QtGui.QFrame.StyledPanel)
topright.setGeometry(0, 320, 1000, 0)

bottom = QtGui.QFrame(self)
bottom.setFrameShape(QtGui.QFrame.StyledPanel)
bottom.setGeometry(1210, 0, 1280, 0)

splitter1 = QtGui.QSplitter(QtCore.Qt.Horizontal)
splitter1.addWidget(topleft)
splitter1.addWidget(topright)

splitter2 = QtGui.QSplitter(QtCore.Qt.Vertical)
splitter2.addWidget(splitter1)
splitter2.addWidget(bottom)

hbox.addWidget(splitter2)

self.setLayout(hbox)
#QtGui.QApplication.setStyle(QtGui.QStyleFactory.create('Cleanlooks'))

根据the documentation,您应该如何称呼它。