我正在做计算机网络作业。我的老师要求我编写一个代理服务器(它支持HTTP / 1.0和HTTP / 1.1)。
在我的源代码中,我创建了一个套接字管理器来管理连接。由于有了新的连接,我创建了一个套接字客户端并将其传递给线程(称为thread1)。套接字管理器将继续监听。在创建的线程中,我执行以下操作:获取IP,端口,方法...,然后创建新的套接字以连接到Web服务器。
成功连接后,我向Web服务器发送请求,并创建一个线程(thread2)从服务器到代理->客户端接收数据。在线程1内的线程2中,线程1将接收来自客户端的请求并发送到代理->服务器。我知道chrome使用非管道HTTP持久化。但是,当我检查发送请求和接收响应的顺序时,我看到它是管道。随后在客户端接收响应之前发送一些请求。你能解释这个问题吗?
要解决此问题,我决定不创建thread2。相反,我在thread1中使用了WHILE循环。客户端将收到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;
}