设为首页 加入收藏

TOP

VC++实现HTTP代理(二)
2014-11-23 19:15:46 】 浏览:2615
Tags:实现 HTTP 代理
MAXBUFLEN);
DataLen = recv(ClientSocket,ReceiveBuf,MAXBUFLEN,0);
if(DataLen == SOCKET_ERROR)
{
printf("错误\n");
closesocket(ClientSocket);
return 0;
}
if(DataLen == 0)
{
closesocket(ClientSocket);
return 0;
}
//处理请求信息,分离出服务器地址
if( ParseHttpRequest(ReceiveBuf,DataLen,(void *)&ServerAddr) < 0)
{
closesocket(ClientSocket);
goto error;
}
//创建新的socket用来和服务器进行连接
ProxySocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
//设置超时时间
setsockopt(ProxySocket,SOL_SOCKET,SO_RCVTIMEO,(char *)&time,sizeof(time));
if(ProxySocket == SOCKET_ERROR)
{
printf("端口创建错误\n");
return 0;
}
if(connect(ProxySocket,(SOCKADDR *)&ServerAddr,sizeof(ServerAddr)) == SOCKET_ERROR)
{
//printf("连接服务器错误");
goto error;
}
//开始进行数据传输处理
//发送到服务器端
if(send(ProxySocket,ReceiveBuf,DataLen,0) == SOCKET_ERROR)
{
//printf("数据发送错误");
goto error;
}
//从服务器端接受数据
while(DataLen > 0)
{
memset(ReceiveBuf,0,MAXBUFLEN);
if((DataLen = recv(ProxySocket,ReceiveBuf,MAXBUFLEN,0)) <= 0)
{
// printf("数据接受错误");
break;
}
else
//发送到客户端
if(send(ClientSocket,ReceiveBuf,DataLen,0) < 0)
{
// printf("数据发送错误");
break;
}
}
error:
closesocket(ClientSocket);
closesocket(ProxySocket);
return 0;
}
int ParseHttpRequest(char * SourceBuf,int DataLen,void * ServerAddr)
{
char * HttpHead = "http://";
char * FirstLocation = NULL;
char * LastLocation = NULL;
char * PortLocation = NULL;
char ServerName[HTTPADDLEN];
char PortString[10];
int NameLen;
struct hostent * pHost;
struct sockaddr_in * pServer = (struct sockaddr_in *)ServerAddr;
//取得http://的位置
FirstLocation = strstr(SourceBuf,HttpHead) + strlen(HttpHead);
//取得/的位置
printf("%s\n",FirstLocation);
LastLocation=strstr(FirstLocation,"/");
//得到http://和/之间的服务器的名称
memset(ServerName,0,HTTPADDLEN);
memcpy(ServerName,FirstLocation,LastLocation - FirstLocation);
//有些情况下,请求的地址中带有端口号格式为“:+ 端口号”;
//取得 :的位置
PortLocation = strstr(ServerName,":");
//填充server结构
pServer->sin_family = AF_INET;
//在url中制定了服务器端口
if(PortLocation != NULL)
{
NameLen = PortLocation - ServerName -1;
memset(PortString,0,10);
memcpy(PortString,PortLocation + 1,NameLen);
pServer->sin_port = htons((u_short)atoi(PortString));
*PortLocation = 0;
}
else//在url中,没有制定服务器端口
{
pServer->sin_port=htons(80);
}
if(NameLen > HTTPADDLEN)
{
printf("服务器名字太长\n");
return -1;
}
//得到服务器信息
//如果地址信息是以IP地址(192.168.0.1)的形式出现的
if(ServerName[0] >= '0' && ServerName[0] <= '9')
首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇VC++实现像360安全桌面一样修改桌.. 下一篇图像的分割和灰度处理(VC++实现)

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目