通过代理服务器连接


  BOOL   connectEx(SOCKET   sockConnect,   LPCTSTR   lpszDestIP,   int   nDestPort,   int   nSocksVer   ,   LPCTSTR   lpszProxyIP   ,   int   nProxyPort   )  
  {  
  BOOL   bIPTypeIsDomain   =   0;  
  SOCKADDR_IN   saDest;  
  saDest.sin_family=   AF_INET;  
  saDest.sin_port   =   htons((u_short)nDestPort);  
  saDest.sin_addr.S_un.S_addr   =   inet_addr(lpszDestIP);  
   
  if(saDest.sin_addr.S_un.S_addr   ==   0)  
  {  
  bIPTypeIsDomain   =   1;  
  //socks4不支持域名解析  
  if(nSocksVer   ==   4)  
  return   0;  
  }  
   
  if(nSocksVer)  
  {  
  //代理服务器地址  
  sockaddr_in   saProxy;  
  saProxy.sin_family=AF_INET;  
  saProxy.sin_port=htons(nProxyPort);  
  saProxy.sin_addr.s_addr=inet_addr(lpszProxyIP);  
   
  //连接代理服务器  
  connect(sockConnect,   (LPSOCKADDR)&saProxy,   sizeof(saProxy));  
   
  if(GetLastError()!=0)  
  return   0;  
   
   
  char   szBuf[1024];  
  szBuf[1023]=0;  
   
  //发送socks命令  
  szBuf[0]   =   nSocksVer   ;  
  szBuf[1]   =   1;  
  szBuf[2]   =   0;  
  if(sendBlock(sockConnect,   szBuf,   3)   ==0)  
  {  
  closesocket(sockConnect);  
  return   0;  
  }  
   
  int   nRecv   =   0;  
   
  nRecv   =   1023;  
  if(recvBlock(sockConnect,   szBuf,   nRecv)   ==   0)  
  {  
  closesocket(sockConnect);  
  return   0;  
  }  
   
  if(nRecv   ==   0)  
  {  
  closesocket(sockConnect);  
  return   0;  
  }  
   
  if(szBuf[0]   ==   nSocksVer   &&   szBuf[1]   ==   0)  
  ;  
  else  
  {  
  closesocket(sockConnect);  
  return   0;  
  }  
   
  //发送socks   connect命令  
  szBuf[0]   =   nSocksVer;  
  szBuf[1]   =   1;  
  szBuf[2]   =   0;  
   
  if(bIPTypeIsDomain)//DOMAIN方式  
  {  
  szBuf[3]   =   3;  
  szBuf[4]   =   strlen(lpszDestIP);  
  strcpy(szBuf+5,   lpszDestIP);  
  memcpy(szBuf+5+szBuf[4],   &(saDest.sin_port)   ,   2);  
  }  
  else//IP4方式  
  {  
  szBuf[3]   =   1;  
  memcpy(szBuf+4,   &(saDest.sin_addr.s_addr),   4);  
  memcpy(szBuf+8,   &(saDest.sin_port),   2);  
  }  
   
  if(sendBlock(sockConnect,   szBuf,   10)==0)  
  {  
  closesocket(sockConnect);  
  return   0;  
  };  
   
  nRecv   =   10;  
  if(recvBlock(sockConnect,   szBuf,   nRecv)   ==   0)  
  {  
  closesocket(sockConnect);  
  return   0;  
  };  
   
  if(nRecv   ==   0)  
  {  
  closesocket(sockConnect);  
  return   0;  
  }  
   
   
  if(szBuf[0]   ==   nSocksVer   &&   szBuf[1]   ==   0)  
  return   1;  
  else  
  return   0;  
   
  }  
  else  
  {  
  connect(sockConnect,   (LPSOCKADDR)&saDest,   sizeof(saDest));  
  if(GetLastError()   ==   0)  
  return   1;  
  else  
  return   0;  
  }  
   
  return   0;  
  }  
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值