做HTTP代理服务器,这种方法(思路)对吗?
做一个最简单的http代理服务器,我 是这样想的。
1、打开一个端口侦听。
2、while(true)
{
clientfd = accept(listenfd,10);
::_beginthread(recvClient,0,(void *)clientfd);
}
3、 recvClient
void recvClient(void *param)
{
clientfd = (SOCKET)param;
char buff[buffLen];
int recvLen;
char address[256];
int port;
//异步模式
unsigned long val=1;
::ioctlsocket(clientfd,FIONBIO,&val);
while(true)
{
recvLen = recv(clientfd,buff,buffLen-1,0);
if (recvLen == SOCKET_ERROR && ::WSAGetLastError() == 10035){
continue;
}else if (recvLen == 0){
logMessage(LOG_INFO,"客户端断开连接!\r\n");
writeErrorToClient(clientfd);
closesocket(clientfd);
::_endthread();
return; //这里应该不用返回的
}else if (recvLen == SOCKET_ERROR){
logMessage(LOG_INFO,"接受客户端信息失败!\r\n");
writeErrorToClient(clientfd);
closesocket(clientfd);
::_endthread();
return ;
}else if(recvLen == buffLen -1 ){
//请求太长了,不处理。
writeErrorToClient(clientfd);
closesocket(clientfd);
::_endthread();
return;
}else{
buff[recvLen] = 0;
logMessage(LOG_INFO,"接受客户端请求:%s",buff);
break;
}
}
//address为请求的服务器地址。
GetAddressAndPort(buff,address,&port);
logMessage(LOG_INFO,"试图打开服务器:%s",address);
serverfd = opensock(address,port);
if (serverfd <=0){
writeErrorToClient(clientfd);
closesocket(clientfd);
::_endthread();
return;
}else if (serverfd > 0)
{
logMessage(LOG_DEBUG,"连接服务器成功(%d)!",serverfd);
send(serverfd,buff,recvLen,0);
logMessage(LOG_DEBUG,"向服务器发送信息成功!");
}
getServerToClient(param);
logMessage(LOG_INFO,"客户机连接结束!");
::_endthread();
return;
}
4、
void getServerToClient(void *param)
{
char buff[buffLen];
int recvLen;
char *ptr;
int lineLen;
//异步模式
unsigned long val=1;
::ioctlsocket(serverfd,FIONBIO,&val);
while(true)
{
memset(buff,0,buffLen);
recvLen = recv(serverfd,buff,buffLen,0);
if (recvLen == SOCKET_ERROR && ::WSAGetLastError() == 10035){
continue;
}else if((recvLen == SOCKET_ERROR)){
logMessage(LOG_ERR,"从服务器传输数据发生错误!错误号:%d",::WSAGetLastError());
closesocket(serverfd);
closesocket(clientfd);
return;
}else if(recvLen == 0){
logMessage(LOG_DEBUG,"服务器断开连接");
closesocket(serverfd);
closesocket(clientfd);
return ;
}else if (recvLen > 0 && recvLen <= buffLen){
recvLen = send(clientfd,buff,recvLen,0);
logMessage(LOG_DEBUG,"向客户端发送数据%d,error:%d",recvLen,::WSAGetLastError());
}
}//end while
}
但是这样子总是有一些小的问题,如访问baidu时,有时没有问题,但是有时网页出不全,
而baidu的Logo图片则经常出不来。(右击-》显示图片则能出现。)
而访问其它的网站,如sohu等则特别的慢,而且总是出一半左右。
通过代理下载软件则没有任何问题。
是哪里的问题呢?
盼高手回答。