#include<stdio.h>
#include<winsock2.h>
#include<process.h>
#include<string.h>
#pragma comment (lib,"ws2_32.lib")
char *buffer=(char*)malloc(1024*1024*6);;
int len1=0;
/*接收目标服务器返回的信息*/
void receive(SOCKET * args)
{
static char ch[100000];
int len;
memset( buffer, 0, sizeof(buffer) );
while( (len=recv(*args,ch,10000,0)) > 0)
{
//len=recv(*args,ch,10000000,0);
//ch[len]='\0';
//strcat(buffer,ch);
for(int i=0;i<len;i++)
buffer[len1+i]=ch[i];
len1=len1+len;
}
buffer[len1]='\0';
return ;
}
void main()
{
/*检查winsock版本号*/
WSADATA wsadata;
if(WSAStartup(MAKEWORD(2,2),&wsadata)!=0)
return ;
if(LOBYTE(wsadata.wVersion)!=2||HIBYTE(wsadata.wVersion)!=2)
{
WSACleanup();
return;
}
/*创建代理服务器和客户端的套接字*/
SOCKET sockclient=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(sockclient==INVALID_SOCKET)
{
printf("sock failed\n");
return ;
}
/*初始化网络信息*/
SOCKADDR_IN clientaddr;
clientaddr.sin_addr.S_un.S_addr =htonl(INADDR_ANY);
clientaddr.sin_family =AF_INET;
clientaddr.sin_port =htons(8000);
/*绑定代理服务器*/
bind(sockclient,(SOCKADDR*)&clientaddr,sizeof(SOCKADDR));
listen(sockclient,5);
int len=sizeof(SOCKADDR);
while(1)
{
SOCKET sockconn=accept(sockclient,(SOCKADDR*)&clientaddr,&len);
/*接受客户端发来的信息*/
char *recvbuf;
recvbuf=(char *)malloc(4*1024*1024);
int n = recv(sockconn,recvbuf,4*1024*1024,0);
recvbuf[n] = '\0';
/*解析收到的信息,破解出客户端的ip和端口号*/
printf("%s\n",recvbuf);
char save[1000];
int num=0;
int k=0;
for (int i = 0 ; i < n ; i ++ )
{
if ( recvbuf[i] == 'H' && recvbuf[i+1] == 'o' && recvbuf[i+2] == 's'&& recvbuf[i+3] == 't' && recvbuf[i+4] == ':'&&recvbuf[i+5]==' ')
{
i=i+6;
while(recvbuf[i]!=':'&&recvbuf[i]!='\r')
{
save[k++]=recvbuf[i];
i++;
}
if(recvbuf[i]==':')
{
i++;
while(recvbuf[i]!='\r')
{
num=num+(int)(recvbuf[i]-'0')*10;
i++;
}
}
save[k]='\0';
break;
}
}
/*去掉accept-Endcoding那部分*/
char ss[1000000];
int kk=0;
for(i=0;i<n;i++)
{
if(recvbuf[i]=='A'&&recvbuf[i+1]=='c'&&recvbuf[i+2]=='c'
&&recvbuf[i+3]=='e'&&recvbuf[i+4]=='p'&&recvbuf[i+5]=='t'
&&recvbuf[i+6]=='-'&&recvbuf[i+7]=='E'&&recvbuf[i+8]=='n'&&recvbuf[i+9]=='c'
&&recvbuf[i+10]=='o'&&recvbuf[i+11]=='d'
&&recvbuf[i+12]=='i'&&recvbuf[i+13]=='n'&&recvbuf[i+14]=='g'
&&recvbuf[i+15]==':'&&recvbuf[i+16]==' '&&recvbuf[i+17]=='g'
&&recvbuf[i+18]=='z'&&recvbuf[i+19]=='i'&&recvbuf[i+20]=='p'&&recvbuf[i+21]==','
&&recvbuf[i+22]==' '&&recvbuf[i+23]=='d'&&recvbuf[i+24]=='e'&&recvbuf[i+25]=='f'&&recvbuf[i+26]=='l'
&&recvbuf[i+27]=='a'&&recvbuf[i+28]=='t'&&recvbuf[i+29]=='e')
//&&recvbuf[i+30]=='\r'&&recvbuf[i+31]=='\n'
{
i=i+29;
}
else
{
ss[kk++]=recvbuf[i];
}
}
ss[kk]='\0';
printf("%s\n",ss);
/*创建代理服务器和目标服务器的套接字*/
SOCKET sockserver=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN serveraddr;
/*判断是域名还是ip地址*/
if(save[0]>'0'&&save[0]<'9')
{
serveraddr.sin_addr.S_un.S_addr=inet_addr(save);
}
else
{
struct hostent *pHost=gethostbyname((char *)save);
serveraddr.sin_addr=*(in_addr *)pHost->h_addr_list[0];
}
serveraddr.sin_family =AF_INET;
if(num!=0)
serveraddr.sin_port =htons(num);
else
serveraddr.sin_port =htons(80);
/*连接目标服务器*/
if(connect(sockserver,(SOCKADDR*)&serveraddr,sizeof(SOCKADDR))!=0)
{
printf("%d\n",WSAGetLastError());
return;
}
/*发送请求给目标服务器*/
if(send(sockserver,ss,strlen(ss)+1,0)==SOCKET_ERROR)
{
printf("%d\n",WSAGetLastError());
return ;
}
/*接受目标服务器发送过来的信息*/
/*
char *buffer;
buffer=(char *)malloc(4*1024*1024);
if(recv(sockserver,buffer,4*1024*1024,0)==SOCKET_ERROR)
{
printf("%d\n",WSAGetLastError());
return ;
}
*/
/*创建进程,循环接收目标服务器发送回来的信息*/
//_beginthread(receive,0,&sockserver);
len1=0;
receive(&sockserver);
shutdown( sockserver , SD_BOTH );
closesocket( sockserver );
/*将信息返回给客户端*/
/*printf("%s\n",buffer);
FILE * fp = fopen( "t.txt", "a+" );
fputs( buffer, fp );
fclose( fp );*/
send(sockconn,buffer,len1,0);
//else
//send(sockconn,buffer,len1,0);
shutdown( sockconn, SD_BOTH );
closesocket(sockconn );
}
}