0

我编写了一组基本的 C++ 类网络编程(除了 tcp_socket、udp_socket 和 ip_address 包装类类)。我在使用 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) 上,第一个连接关闭()。知道出了什么问题吗?

4

1 回答 1

1

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

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

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

于 2015-02-25T14:55:12.697 回答