代理服务器

#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 );
 }
 
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值