Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
客户没有';如果通过代理连接,则不要断开连接 注:我在混合一些C+C++,但不应该太混淆。_C++_Sockets_Proxy - Fatal编程技术网

客户没有';如果通过代理连接,则不要断开连接 注:我在混合一些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