Как узнать, когда веб-сервер полностью отправил данные, и ждать получения нового запроса? - PullRequest
1 голос
/ 04 июня 2019

Я делаю домашнее задание по компьютерной сети.Мой учитель попросил меня написать прокси-сервер (он поддерживает HTTP / 1.0 и HTTP / 1.1).

В своем исходном коде я создаю диспетчер сокетов для менеджеров соединений.Поскольку у меня новое соединение, я создаю сокет-клиент и передаю его в поток (назовите его thread1).Диспетчер сокетов продолжит прослушивание.И в потоке, который я создал, я делаю что-то вроде: получение IP, порта, метода ... и затем создаю новый сокет для подключения к веб-серверу.
При успешном подключении я отправляю запрос на веб-сервер и создаю поток (thread2) для получения данных с сервера на прокси -> клиент.Thread2 внутри thread1, thread1 будет получать запрос от клиента и отправлять на прокси -> сервер.Я знаю, что Chrome использует постоянный с не конвейерным http.Но когда я проверяю порядок отправки запросов и получения ответов, я вижу, что это конвейер.Некоторые запросы впоследствии отправляются до того, как клиент получит ответ.Можете ли вы объяснить эту проблему?

Чтобы решить ее, я решил не создавать thread2.Вместо этого я использую цикл WHILE в thread1.Клиент получает ultil Server полностью отправленный ответ (только 1 ответ), а затем отправляет новый запрос без закрытия соединения.Но я не знаю, как узнать, когда сервер полностью отправляет данные.Я думаю, что это сделано, когда длина полученных данных = 0, но сервер не закрыл соединение.Можете ли вы дать мне решение?Благодарю.Извините за мой английский, это плохо.

//thread1: call thread2 and send request to Proxy -> Server
CWinThread *p = AfxBeginThread((AFX_THREADPROC)proxyToServer, (LPVOID)P);

    //up stream, Client -> Proxy -> Server
    while (P->isClientClose == FALSE && P->isServerClose == FALSE){
        memset(DataTemp, 0, 10001);
        Length = recv(*Client, DataTemp, 10000, 0);
        if (Length <= 0){
            break;
        }
        Length = send(*Server, DataTemp, Length, 0);
        if (Length <= 0){
            break;
        }
    }
    if (P->isClientClose == FALSE){
        P->isClientClose = TRUE;
        closesocket(*Client);
    }
    if (P->isServerClose == FALSE){
        P->isServerClose = TRUE;
        closesocket(*Server);
    }
//thread2, send data from Server -> Proxy -> Client
DWORD WINAPI proxyToServer(LPVOID* pParam){
    Param *P = (Param*)pParam;
    char *Data = new char[10001];
    while (P->isClientClose == FALSE && P->isServerClose == FALSE){
        memset(Data, 0, 10001);
        int length = recv(*(P->SERVER), Data, 10000, 0);
        if (length <= 0) 
            break;
        length = send(*(P->CLIENT), Data, length, 0);
        if (length <= 0) 
            break;
    }
    if (P->isClientClose == FALSE){
        P->isClientClose = TRUE;
        closesocket(*(P->CLIENT));
    }
    if (P->isServerClose == FALSE){
        P->isServerClose = TRUE;
        closesocket(*(P->SERVER));
    }
    delete[]Data;
    return 1;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...