客户没有';如果通过代理连接,则不要断开连接 注:我在混合一些C+C++,但不应该太混淆。
连接的客户端被添加到一个多映射(我知道可能也是一个映射^^) 多重地图客户没有';如果通过代理连接,则不要断开连接 注:我在混合一些C+C++,但不应该太混淆。,c++,sockets,proxy,C++,Sockets,Proxy,连接的客户端被添加到一个多映射(我知道可能也是一个映射^^) 多重地图 typedef std::multimap<std::string, SOCKET> clientMap; typedef std::pair<clientMap::iterator, clientMap::iterator> clientIters; clientMap clientmap
typedef std::multimap<std::string, SOCKET> clientMap;
typedef std::pair<clientMap::iterator,
clientMap::iterator>
clientIters;
clientMap clientmap;
clientIters clientByID(std::string clientID)
{
return clientmap.equal_range(clientID);
}
removeUser()函数
void removeUser(std::string clientID)
{
std::cout << "Going to try and remove client: " << clientID << std::endl;
//Remove client
clientIters iters = clientByID(clientID);
clientMap::iterator it = iters.first;
while(it != iters.second)
{
clientmap.erase(it++);
std::cout << "removed client: " << it->first << std::endl;
}
//Show remaining clients
std::cout << "clients left:" << std::endl;
for (clientMap::iterator it = clientmap.begin(); it != clientmap.end(); ++it)
{
std::cout << it->first << std::endl;
}
}
但是如果我在中间放置了一个代理(使用proxifier),服务器会认为连接仍然处于活动状态,或者其他原因,因为当我关闭客户端时,服务器没有执行任何操作。它就在那里。。什么也不等
我正在使用它作为基础,但现在已经做了大量修改
如何确保已关闭的客户端确实已从multimap中删除?能否为每个连接存储一些状态?就像上次收到东西一样
然后,您可以定期在活动连接中循环,并删除长时间未发送任何内容的连接,因为该连接很可能已过时。我猜代理软件可能仍在保持与服务器的连接畅通?@Luke根据Proxifier,连接已关闭。对
recv()
的调用是否会无限期阻塞?如果这是您的意思,则不会超时。这样安全吗?我使用multimap一次向所有连接的客户机广播消息,如果它试图向未真正连接的客户机发送消息,这不是很危险吗?会发生什么?我真的不知道,你得试试看。我想向客户发送一条并不存在的消息应该不会有问题。。。
ret = recv(sock, szBuff, DEFAULT_BUFFER, 0);
if (ret == 0) // Graceful close
break;
else if (ret == SOCKET_ERROR)
{
printf("recv() failed: %d\n", WSAGetLastError());
removeUser(clientID);
break;
}
void removeUser(std::string clientID)
{
std::cout << "Going to try and remove client: " << clientID << std::endl;
//Remove client
clientIters iters = clientByID(clientID);
clientMap::iterator it = iters.first;
while(it != iters.second)
{
clientmap.erase(it++);
std::cout << "removed client: " << it->first << std::endl;
}
//Show remaining clients
std::cout << "clients left:" << std::endl;
for (clientMap::iterator it = clientmap.begin(); it != clientmap.end(); ++it)
{
std::cout << it->first << std::endl;
}
}
recv() failed: 10054
Going to try and remove client 0000008C
removed client 0000008C
clients left:
00000084
00000088