C++I/O多路复用服务器过早关闭连接

C++ I/O Multiplexed server closes connections prematurely

本文关键字:连接 服务器 多路 复用 C++I      更新时间:2023-10-16

我编写了一组基本的C++类的网络编程集(除了tcp_socket、udp_socket和ip_address-wrapp类之外没有什么了)。我的I/O多路复用服务器出现了一些问题。让我解释一下:

场景是这样的:

class base_socket
{
   //code for all sockets methods (both tcp and udp this class throws
   //errors and derived classes will cathc them.
   ~base_socket() { ::close(sock_fd); }
};
class udp_socket : public base_socket
{ 
  //code for the udp_socket
  virtual ~udp_socket();
};
class tcp_socket : public base_socket
{
  //code for the tcp_socket
  virtual ~tcp_socket();
};

在这个方案中,根据应用程序的上下文,我添加了更深层次的抽象:类似的东西

class client_t : public tcp_socket
{
  //code for dependent client tasks
};

主程序代码类似于

int main(int argc , char *[] argv)
{
  int maxfd;
  fd_set rset;
  std::vector<base_socket> clientsV;
while(1)
{     
  FD_ZERO( &rset);
    FD_SET( {/*listening socket fd*/, &rset);
    if( clientsV.size() > 0)
        maxfd = // socket fd with max value between sockets
    else 
        maxfd = //listen socket
    for (auto it = clientsV.begin() ; it != clientsV.end(); ++it)
        FD_SET( /*client's socket fd*/, &rset);
    select( maxfd+1, &rset, NULL, NULL, NULL) < 0);
    if( FD_ISSET( /*listeing_socket*/, &rset)) 
    { 
       client_t * newclient = new client_t();
       listening_socket.accept(newclient);
       newClient->send_message("HELO");
       clientsV.push_back(*newClient);
    }

  }    
}

这对第一个客户端有效,但当第二个客户端到来时,它会得到HELO响应,但在第二个客户机V.push_back(*newClient)上,第一个连接会关闭()。知道出了什么问题吗?

您的clientsV成员应该是std::vector<base_socket*>(即保留指针引用)。如果临时client_t对象需要将现有元素重新定位到其他区域,则有可能在push_back期间创建并销毁该对象(请参见为什么vector::push_back和template_back调用value_type::constructor两次?)。

当这种情况发生时,~client_t()被调用,套接字现在被关闭。

此外,您的内存泄漏。您正在使用new分配指针,但您存储了取消引用的副本。实际上,您应该按原样存储指针(并在需要时管理delete)。