Клиент не отключается при подключении через прокси - PullRequest
0 голосов
/ 18 декабря 2011

Примечание: я смешиваю некоторые C & C ++, но это не должно быть слишком запутанным.

Подключенные клиенты добавляются в мультикарту (возможно, это была карта, я знаю ^^).

Мультикарта

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);
}

Добавление клиента (каждый клиент работает в своем собственном потоке)

//Add clientID to map of clients
if(clientAdded == false)
{
    std::stringstream ss;
    ss << lpParam; //Use socket# as the unique ID
    clientID = ss.str();
    clientmap.insert(std::pair<std::string,SOCKET>(clientID,sock));
    clientAdded = true;
}
//Client wasn't added correctly!
if(clientID == "" || clientAdded == false)
{
    std::cout << "Problem adding client" << std::endl;
}

Сервер ожидает клиентских сообщений с блокирующим вызовом recv ()

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;
}

функция 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;
    }
}

Все это работает нормально, если я закрываю клиента, который был подключен либо к моему локальному IP, либо к внешнему IP (напрямую).

recv() failed: 10054
Going to try and remove client 0000008C
removed client 0000008C
clients left:
00000084
00000088

Но если я помещаю промежуточный прокси-сервер (используя проксификатор), сервер думает, что соединение все еще активно или что-то еще, потому что сервер не делает ничего , когда я закрываю клиент. Он просто сидит там .. ничего не ждет.

Я использую этот класс сокетов в качестве базы, но сейчас он довольно сильно модифицирован.

Как я могу убедиться, что закрытый клиент определенно удален из мультикарты?

1 Ответ

0 голосов
/ 18 декабря 2011

Не могли бы вы сохранить состояние для каждого соединения? как в прошлый раз что-то было получено?

После этого вы могли бы периодически просматривать свои активные подключения и удалять любые, которые ничего не отправляли в течение длительного времени, так как соединение более вероятно устарело.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...