C++I/O多路复用服务器过早关闭连接
C++ I/O Multiplexed server closes connections prematurely
我编写了一组基本的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
)。
相关文章:
- QTcpSocket在不阻塞GUI的情况下重新连接到服务器
- C++套接字客户端到 Python 服务器未创建连接
- 计算出有多少客户端可以连接到我正在使用的一些tcp服务器代码
- 在 QNX 中,如何管理服务器和客户端之间的 IPC 连接?
- QTcpSocket 在 RemoteHostClosedError 后重新连接到服务器时无法传输数据
- C++ Winsock2 客户端未通过远程 IP 连接到服务器
- iocp openssl 对等服务器在与 ConnectEx 连接后关闭连接
- boost beast websocket服务器也接受http连接
- 带有openSSL的libwebsocket服务器不接受连接
- 检测grpc服务器中关闭的客户端连接
- QAbstractSocket 从服务器端关闭连接时的奇怪行为
- 仅通过建立一次TCP连接将Recv从客户端发送到服务器套接字
- C++ WebSocket 帧发送会导致服务器关闭连接
- 为什么我的客户端无法连接到服务器?
- 将移动设备(iOS和Android)连接到带有QT / C++和镜像显示的VNC服务器
- 我正在编写一个简单的客户端套接字应用程序,但在连接后服务器收到一个空缓冲区
- 提升 ASIO 服务器 - 检测空闲连接
- C++ 套接字 read() 有时在连接到服务器时返回 -1
- "MFC/C++ Socket programming.." 如何连接服务器和客户端?
- 无法使用LDAP SSL连接服务器