2011-12-18 4 views
0

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

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

MultiMap

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 

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

Я использую this socket class в качестве базы, но к настоящему времени он довольно сильно изменен.

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

+0

Мое предположение, что прокси-программное обеспечение все еще может поддерживать соединение открытым для вашего сервера? –

+0

@ Luke согласно Proxifier, соединение было закрыто. – natli

+0

Выполняется ли ваш вызов 'recv()' block неопределенно? –

ответ

0

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

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

+0

Будет ли это безопасно? Я использую multimap для широковещательных сообщений для всех подключенных клиентов одновременно, разве это не опасно, если он пытается отправить сообщение клиенту, который на самом деле не подключен? Что случилось бы? – natli

+0

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

Смежные вопросы