做HTTP代理服务器,这种方法(思路)对吗?

hbbdren 2008-06-17 02:36:42
做一个最简单的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等则特别的慢,而且总是出一半左右。

通过代理下载软件则没有任何问题。

是哪里的问题呢?

盼高手回答。

...全文
306 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
WinEggDrop 2008-06-22
  • 打赏
  • 举报
回复
http代理的源代码满大街都是,你随便下载个回去研究下就清楚了.
蒋慧平 2008-06-22
  • 打赏
  • 举报
回复
我已经做了http代理服务器,运行效果还不错。

可以加我Q聊下

Q:274220992
huangzhl03 2008-06-21
  • 打赏
  • 举报
回复
Http代理服务器收到客户端的请求后需要修改请求头中的一部分才能转发出去,具体可以看看HTTP1.0或1.1的文档

18,357

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧