gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 06:24:45 25 4
gpt4 key购买 nike

我写了一组基本的 C++ 类网络编程(除了一个 tcp_socket 一个 udp_socket 和一个 ip_address wrap class 类)。我在使用 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_tpush_back 期间正在创建和销毁对象如果它需要将现有元素重新定位到不同的区域(参见 Why does vector::push_back and emplace_back call value_type::constructor twice?)。

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

另外,你有内存泄漏。您正在使用 new 分配一个指针但您存储取消引用的拷贝。您实际上应该按原样存储指针(并在需要时管理 delete ing 它)。

关于C++ I/O 多路复用服务器过早关闭连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28720348/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com