CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

哪儿可以找到关于SOCKET5代理协议的资料?

楼主w12(无心)2001-11-11 10:27:18 在 VC/MFC / 基础类 提问

问题点数:20、回复次数:4Top

1 楼jason802(小糊涂仙)回复于 2001-11-11 10:54:41 得分 10

这里去找找.  
   
  http://www.china-pub.com/computers/eMook/emooknew/RFC/rfc-activeT.htm  
   
  Top

2 楼coolfired()回复于 2001-11-11 11:25:11 得分 10

穿透代理服务器编程    
   
   
   
   
   
   
  时间:2001/08/13   10:37    
  作者:田进恩   VC知识库    
   
   
   
   
   
   
   
   
   
   
   
      关键词:代理服务器、Socks4、Socks5、Http代理    
   
   
   
   
   
  在网络程序设计过程中,我们经常要与各种类型的代理服务器打交道,比如在企业内部网通过代理去访问Internet网上的服务器等等,一般代理服务器支持几种常见的代理协议标准,如Socks4,Socks5,Http代理,其中Socks5需要用户验证,代理相对复杂。我在查阅RFC文档和相关资料后,特总结一些TCP协议穿透代理服务器的程序片断,希望对大家有所帮助。    
   
   
   
   
   
  //使用到的结构    
   
   
  struct   sock4req1    
   
   
  {    
   
   
  char   VN;    
   
   
  char   CD;    
   
   
  unsigned   short   Port;    
   
   
  unsigned   long   IPAddr;    
   
   
  char   other[1];    
   
   
  };    
   
   
   
   
   
  struct   sock4ans1    
   
   
  {    
   
   
  char   VN;    
   
   
  char   CD;    
   
   
  };    
   
   
   
   
   
  struct   sock5req1    
   
   
  {    
   
   
  char   Ver;    
   
   
  char   nMethods;    
   
   
  char   Methods[255];    
   
   
  };    
   
   
   
   
   
  struct   sock5ans1    
   
   
  {    
   
   
  char   Ver;    
   
   
  char   Method;    
   
   
  };    
   
   
   
   
   
  struct   sock5req2    
   
   
  {    
   
   
  char   Ver;    
   
   
  char   Cmd;    
   
   
  char   Rsv;    
   
   
  char   Atyp;    
   
   
  char   other[1];    
   
   
  };    
   
   
   
   
   
  struct   sock5ans2    
   
   
  {    
   
   
  char   Ver;    
   
   
  char   Rep;    
   
   
  char   Rsv;    
   
   
  char   Atyp;    
   
   
  char   other[1];    
   
   
  };    
   
   
   
   
   
  struct   authreq    
   
   
  {    
   
   
  char   Ver;    
   
   
  char   Ulen;    
   
   
  char   Name[255];    
   
   
  char   PLen;    
   
   
  char   Pass[255];    
   
   
  };    
   
   
   
   
   
  struct   authans    
   
   
  {    
   
   
  char   Ver;    
   
   
  char   Status;    
   
   
  };    
   
   
   
   
   
  //通过Socks4方式代理    
   
   
  if(   !ClientSock.Connect(   g_ProxyInfo.m_strProxyIP,g_ProxyInfo.m_nProxyPort)   )    
   
   
  {    
   
   
  m_sError   =   _T("不能连接到代理服务器!");    
   
   
  ClientSock.Close();    
   
   
  return   FALSE;    
   
   
  }    
   
   
  char   buff[100];    
   
   
  memset(buff,0,100);    
   
   
  struct   sock4req1   *m_proxyreq;    
   
   
  m_proxyreq   =   (struct   sock4req1   *)buff;    
   
   
  m_proxyreq-〉VN   =   4;    
   
   
  m_proxyreq-〉CD   =   1;    
   
   
  m_proxyreq-〉Port   =   ntohs(GetPort());    
   
   
  m_proxyreq-〉IPAddr   =   inet_addr(GetServerHostName());    
   
   
  ClientSock.Send(buff,9);    
   
   
  struct   sock4ans1   *m_proxyans;    
   
   
  m_proxyans   =   (struct   sock4ans1   *)buff;    
   
   
  memset(buff,0,100);    
   
   
  ClientSock.Receive(buff,100);    
   
   
  if(m_proxyans-〉VN   !=   0   ||   m_proxyans-〉CD   !=   90)    
   
   
  {    
   
   
  m_sError   =   _T("通过代理连接主站不成功!");    
   
   
  ClientSock.Close();    
   
   
  return   FALSE;    
   
   
  }    
   
   
   
   
   
   
   
   
   
   
   
   
   
   
  //通过Socks5方式代理    
   
   
  if(   !ClientSock.Connect(   g_ProxyInfo.m_strProxyIP,g_ProxyInfo.m_nProxyPort)   )    
   
   
  {    
   
   
  m_sError   =   _T("不能连接到代理服务器!");    
   
   
  ClientSock.Close();    
   
   
  return   FALSE;    
   
   
  }    
   
   
  char   buff[600];    
   
   
  struct   sock5req1   *m_proxyreq1;    
   
   
  m_proxyreq1   =   (struct   sock5req1   *)buff;    
   
   
  m_proxyreq1-〉Ver   =   5;    
   
   
  m_proxyreq1-〉nMethods   =   2;    
   
   
  m_proxyreq1-〉Methods[0]   =   0;    
   
   
  m_proxyreq1-〉Methods[1]   =   2;    
   
   
  ClientSock.Send(buff,4);    
   
   
  struct   sock5ans1   *m_proxyans1;    
   
   
  m_proxyans1   =   (struct   sock5ans1   *)buff;    
   
   
  memset(buff,0,600);    
   
   
  ClientSock.Receive(buff,600);    
   
   
  if(m_proxyans1-〉Ver   !=   5   ||   (m_proxyans1-〉Method!=0   &&   m_proxyans1-〉Method!=2))    
   
   
  {    
   
   
  m_sError   =   _T("通过代理连接主站不成功!");    
   
   
  ClientSock.Close();    
   
   
  return   FALSE;    
   
   
  }    
   
   
  if(m_proxyans1-〉Method   ==   2)    
   
   
  {    
   
   
  int   nUserLen   =   strlen(g_ProxyInfo.m_strProxyUser);    
   
   
  int   nPassLen   =   strlen(g_ProxyInfo.m_strProxyPass);    
   
   
  struct   authreq   *m_authreq;    
   
   
  m_authreq   =   (struct   authreq   *)buff;    
   
   
  m_authreq-〉Ver   =   1;    
   
   
  m_authreq-〉Ulen   =   nUserLen;    
   
   
  strcpy(m_authreq-〉Name,g_ProxyInfo.m_strProxyUser);    
   
   
  m_authreq-〉PLen   =   nPassLen;    
   
   
  strcpy(m_authreq-〉Pass,g_ProxyInfo.m_strProxyPass);    
   
   
  ClientSock.Send(buff,513);    
   
   
  struct   authans   *m_authans;    
   
   
  m_authans   =   (struct   authans   *)buff;    
   
   
  memset(buff,0,600);    
   
   
  ClientSock.Receive(buff,600);    
   
   
  if(m_authans-〉Ver   !=   1   ||   m_authans-〉Status   !=   0)    
   
   
  {    
   
   
  m_sError   =   _T("代理服务器用户验证不成功!");    
   
   
  ClientSock.Close();    
   
   
  return   FALSE;    
   
   
  }    
   
   
  }    
   
   
  struct   sock5req2   *m_proxyreq2;    
   
   
  m_proxyreq2   =   (struct   sock5req2   *)buff;    
   
   
  m_proxyreq2-〉Ver   =   5;    
   
   
  m_proxyreq2-〉Cmd   =   1;    
   
   
  m_proxyreq2-〉Rsv   =   0;    
   
   
  m_proxyreq2-〉Atyp   =   1;    
   
   
  unsigned   long   tmpLong   =   inet_addr(GetServerHostName());    
   
   
  unsigned   short   port   =   ntohs(GetPort());    
   
   
  memcpy(m_proxyreq2-〉other,&tmpLong,4);    
   
   
  memcpy(m_proxyreq2-〉other+4,&port,2);    
   
   
  ClientSock.Send(buff,sizeof(struct   sock5req2)+5);    
   
   
  struct   sock5ans2   *m_proxyans2;    
   
   
  memset(buff,0,600);    
   
   
  m_proxyans2   =   (struct   sock5ans2   *)buff;    
   
   
  ClientSock.Receive(buff,600);    
   
   
  if(m_proxyans2-〉Ver   !=   5   ||   m_proxyans2-〉Rep   !=   0)    
   
   
  {    
   
   
  m_sError   =   _T("通过代理连接主站不成功!");    
   
   
  ClientSock.Close();    
   
   
  return   FALSE;    
   
   
  }    
   
   
   
   
   
   
   
   
   
   
   
   
   
   
  //通过HTTP方式代理    
   
   
  if(   !ClientSock.Connect(   g_ProxyInfo.m_strProxyIP,g_ProxyInfo.m_nProxyPort)   )    
   
   
  {    
   
   
  m_sError   =   _T("不能连接到代理服务器!");    
   
   
  ClientSock.Close();    
   
   
  return   FALSE;    
   
   
  }    
   
   
  char   buff[600];    
   
   
  sprintf(   buff,   "%s%s:%d%s","CONNECT   ",GetServerHostName(),GetPort(),"   HTTP/1.1\r\nUser-Agent:   MyApp/0.1\r\n\r\n");    
   
   
  ClientSock.Send(buff,strlen(buff));   //发送请求    
   
   
  memset(buff,0,600);    
   
   
  ClientSock.Receive(buff,600);    
   
   
  if(strstr(buff,   "HTTP/1.0   200   Connection   established")   ==   NULL)   //连接不成功    
   
   
  {    
   
   
  m_sError   =   _T("通过代理连接主站不成功!");    
   
   
  ClientSock.Close();    
   
   
  return   FALSE;    
   
   
  }    
   
  我们一般先与代理服务器连通,然后向代理服务器发送代理验证的用户名和密码(如果需要,如Socks5代理),验证成功后,再向代理服务器发送需要连接的目的地址和端口。以上代码仅用于TCP连接,如果在内部网侦听或通过UDP协议发送信息,可查阅RFC1829等文档资料。    
  以上资料来自http://202.114.245.75/mhsguru/mhsguru.asp(教科网内部资料)Top

3 楼w12(无心)回复于 2001-11-13 13:12:11 得分 0

谢谢两位Top

4 楼w12(无心)回复于 2001-11-13 13:42:48 得分 0

jie  
  Top

相关问题

  • 请问,哪里可以找到socket编程和应用层协议的资料?
  • 用http代理http协议 和 用socks4,socks5代理http协议有区别么?
  • 有关于Http代理协议的RFC文档吗??
  • 公司代理服务器只有http协议,怎么qq啊
  • 请问哪位大侠有http代理协议的文档
  • 高分求教!!!关于代理POP协议实现!
  • win2000中"rtsp"协议不能使用代理的问题
  • 有没有socket代理的源代码?
  • 关于socket 5代理的问题
  • 请问socket代理的原理:)

关键词

  • 服务器
  • 协议
  • 资料
  • 代理
  • sock
  • proxyreq
  • ver
  • vn
  • req
  • struct

得分解答快速导航

  • 帖主:w12
  • jason802
  • coolfired

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo