Я делаю домашнее задание по компьютерной сети.Мой учитель попросил меня написать прокси-сервер (он поддерживает 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;
}