代理程序为什么看不到网页源码?
用socket实现的HTTPS代理程序,代理程序收发数据的核心代码如下:
//******************************************************************************************
// SOCKET serversock(IN) 与原始服务器通信的套接字
// SOCKET clientsock(IN) 与客户端通信的套接字
// int tmo(IN) 时间限制,select 的最长等待时间
//*****************************************************************************************
int create_select_pipe(SOCKET serversock,SOCKET clientsock,int tmo)
{
struct timeval tm;
fd_set readfds;
int maxfd=0;
char buf[PACKAGE_SIZE+1];
int len;
//s1 处理与 client 的通信, s2 应该处理与 原始服务的通信
int s1=clientsock,s2=serversock;
int server_recv_len=0,client_recv_len=0;
memset(&tm,0,sizeof(tm));
if(s1<=0||s2<=0)
return 0;
int ret=0;
int max_recv_len=0;
for(;;)
{
maxfd=s2>s1? s2:s1;
FD_ZERO(&readfds);
FD_SET(s1,&readfds);
FD_SET(s2,&readfds);
tm.tv_sec=tmo;
ret=select(maxfd+1,&readfds,NULL,NULL,(tmo==0)?NULL:&tm);
if(ret<=0)
break;
max_recv_len=PACKAGE_SIZE;
if(FD_ISSET(s1,&readfds)) //从客户端接收消息,给服务器发送过去
{
if((len=recv(s1, buf,max_recv_len,0))<=0)
{
ret=s1;
break;
}
buf[len]=0;
printf("***************leave read:\n%s\n",buf);
if(send(s2,buf,len,0)<=0)
{
ret=s2;
break;
}
}
else if(FD_ISSET(s2,&readfds))//从服务器接收消息,给客户端发送过去
{
if((len=recv(s2,buf,max_recv_len,0))<=0)
{
ret=s2;
break;
}
if(send(s1, buf,len,0)<=0){
ret=s1;
break;
}
}else
{
printf("Err on create_select_pipe\n");
break;
}
}
return ret;
}
客户端通过该代理登陆HTTPS服务器,能够正常访问。在代理HTTPS通信时,recv函数(红色代码部分)接收服务器端发回的网页数据,但buf中看到的是乱码,如何从buf中还原网页源码呢?请资深人士指点!
[解决办法]
代理上需要接收网站的HTTPS请求,生成整个应用数据,类似浏览器等,然后再转发给客户端,这样代理才可以看到.
[解决办法]
你收到的数据可能是经过压缩的gzip数据
[解决办法]