穿透代理服务器编程

本地部署DeepSeek-Coder-6.7B 离线版的完整指南:打造适配当前系统的AI助手 《DeepSeek-Coder-6.7B本地部署指南》详细介绍了如何离线部署这款专注于代码生成的AI模型。文章涵盖硬件要求(推荐8核CPU、32GB内存、NVIDIA RTX3080显卡)、软件依赖(Python3.8+、CUDA11.0+、PyTorch1.9+)以及具体安装步骤,包括模型下载、路径配置和GPU加速设置。重点说明如何通过输入系统配置文档和使用说明书,让模型生成适配特定系统的代码,并提供了参数调优和模型微调的方法。该指南旨在帮助开发者在本地安全高效地使用AI助手,实现代码自动生成与优化,提升 阅读详情

 田进恩   allfresh@263.net  
          关键词:代理服务器、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等文档资料。  
   
   
   
   
   
  //   与代理服务器建立CONNECT;          
          int   retErr   =   connect(m_hSocketpop,(SOCKADDR*)&ToAddr,sizeof(ToAddr));  
          if(retErr   ==   SOCKET_ERROR)  
          {  
                  printf("connect   error");  
                  return   -1;  
          }  
          char   buf[100];  
          //   让PROXY选择认证方法  
          buf[0]   =   0x05;  
          buf[1]   =   0x01;  
          buf[2]   =   0x00;   //   无需认证  
          send(m_hSocketpop,(const   far   char*)buf,3,0);  
          recv(m_hSocketpop,buf,10,0);  
          if(buf[1]   !=   0x00)  
                  printf("Need   to   authenticate!/n");  
          //   向PROXY服务器发送CONNECT   请求,  
          WORD   port   =   80;  
          buf[0]   =   0x05;  
          buf[1]   =   0x01;         //   connection   request.  
          buf[2]   =   0x00;         //   reserved!  
          buf[3]   =   0x01;         //   address   type:Ip   V4   ;  
          buf[4]   =   0xd3;    
          buf[5]   =   0x64;    
          buf[6]   =   0x1f;    
          buf[7]   =   0x61;  
          buf[8]   =   port/256;                         //0x80;  
          buf[9]   =   (BYTE)port%256;         //0x00;  
          port   +=   1;  
          send(m_hSocketpop,(const   far   char*)buf,10,0);  
          //   接收PROXY服务器返回的REPLY  
          recv(m_hSocketpop,buf,20,0);  
          if(buf[1]   !=   0)   //   只有当第二个字节为0时,才表示成功。  
          {  
                  printf("Cannot   connect   to   the   remote   server!/n");  
                  return   -1;  
          }  
          //   用PROXY服务器返回的REPLY中的地址与端口号来CONNECT   目的主机  
          SOCKADDR_IN   SockAddr;  
          SOCKET   prxSock;  
          prxSock   =   socket(AF_INET,   SOCK_STREAM   ,0);     //   SOCK_DGRAM  
          port   =   ((WORD)buf[8])*256   +   (WORD)buf[9];   //   返回的端口号在buf[8]   和   buf[9]   中  
          memset(&SockAddr,0,sizeof(SockAddr));  
          SockAddr.sin_family   =   AF_INET;  
          SockAddr.sin_port   =   port;  
          SockAddr.sin_addr.S_un.S_un_b.s_b1   =   buf[4];    
          SockAddr.sin_addr.S_un.S_un_b.s_b2   =   buf[5];  
          SockAddr.sin_addr.S_un.S_un_b.s_b3   =   buf[6];  
          SockAddr.sin_addr.S_un.S_un_b.s_b4   =   buf[7];  
          retErr   =   connect(prxSock,(SOCKADDR*)&SockAddr,sizeof(SockAddr));  
          if(retErr   ==   SOCKET_ERROR)  
                  printf("error");    
          /*连接已经建立好了,下面你就可以用prxSock用send发送数据了。*/  
          char   *pInfo   =   (char   *)malloc(100);  
          strcpy(pInfo,"Only   a   test");  
          send(prxSock,pInfo,100,0);

相关推荐

C++实现SIP代理服务器项目实战

本章详细介绍了C++网络编程与多线程并发控制的基础知识,并结合SIP代理服务器的实现需求,提供了具体代码示例和优化建议。我们讨论了:套接字编程基础(TCP/UDP)数据收发与缓冲区管理线程池设计与实现线程间通信与同步机制线程安全的SIP事务管理C++11/14/17异步编程技术这些内容为构建高性能、高并发的SIP代理服务器提供了坚实的基础。在下一章中,我们将引入Poco库,进一步简化网络通信与事件驱动模型的实现。

weixin_34718952的博客 800

代理穿透还能这么玩?

远程桌面是我每天都要用到的东西,临时在家远程公司电脑排查问题,又或者之前广州疫情,需要居家办公远程公司电脑工作。远程工具其实有很多,如Todesk、TeamViewer、RustDesk、向日葵等,但我在用过之后都觉得这些不好用,远不如微软自带的远程桌面工具更好用,但这款远程工具却只支持局域网,而我又有在家远程公司电脑的需求,到后来我发现用代理穿透

C_tongxue的博客 1863

Cesium POI点聚合方法[代码]

本文介绍了一种在Cesium中实现primitive加载POI点聚合的简单方法。由于Cesium本身未提供primitive聚合功能,通常需要修改EntityCluster.js源码来实现,但本文提出了另一种解决方案。该方法利用DistanceDisplayCondition属性,通过为每个POI点设置显隐距离限制来控制其显示。具体实现中,根据POI点的typename字段在数据库中的层级关系(如“汽车服务;加油站;加油站”为最远视距,“汽车服务;加油站”为中视距,“汽车服务”为最近视距),动态返回相应的视距范围。代码示例展示了如何通过_clustering方法计算视距,并在_add方法中应用distanceDisplayCondition来控制POI点的显示。最终效果实现了远、中、近视距下POI点的分级显示。

软件开发规范(一)

http://www.itbookreview.net/itbookreview/view_paper.asp?paper_id=20我总结的一些软件开发规范  作者 allfresh 原作者姓名 allfresh文章原始出处 http://www.allfresh.net/ 正文为了提高软件开发质量,降低开发周期,增强代码的可重用性和易读性,使软件便于维护,开发人员间便于交流和协作,特总结出开发

hahahouhou的专栏 1102

Linux网络编程:一个简单的正向代理服务器的实现

Linux是一个可靠性非常高的操作系统,但是所有用过Linux的朋友都会感觉到, Linux和Windows这样的"傻瓜"操作系统(这里丝毫没有贬低Windows的意思,相反这应该是Windows的优点)相比,后者无疑在易操作 性上更胜一筹。但是为什么又有那么多的爱好者钟情于Linux呢,当然自由是最吸引人的一点,另外Linux强大的功能也是一个非常重要的原因,尤其是 Linux强大的网络功能更是

没事的时候找点事做。 3384

toad中国代理商-Toad下载-Toad价格-Toad培训服务

 Toad是Oracle,SQL Server等数据库人员很得力的开发和管理工具。 北京铸锐数码科技有限公司是Quest Toad中国区较早的代理商之一。拥有丰富的Toad使用和管理经验。服务热线:010-62139280 欢迎来电咨询Toad价格和Toad培训服务。 网址:http://www.innovatedigital.comToad介绍:http://ww

liubang200707的专栏 1807

Http代理穿透技术

穿透代理服务器编程  http://blog.csdn.net/snail8384/article/details/3613373 透过代理看世界 用VC++实现http代理 http://school.cnd8.com/c/jiaocheng/8706.htm Http代理穿透技术: http://hi.baidu.com/aebiz_wxp/item/1

blade2001的专栏 1652

【Linux网络编程】第十八弹---深入探索网络通信技术:NAT技术、代理服务器、内网穿透与打洞全解析

NAT 技术背景:NAT IP 转换过程,NAPT,NAT 技术的缺陷;代理服务器:正向代理,反向代理:NAT 和代理服务器;内网穿透;内网打洞;总结:数据链路层,网络层,传输层,应用层~~~

小林熬夜学习编程的博客 2789

【Linux网络编程】NAT、代理服务、内网穿透

NAT、内网穿透、正向代理服务器、反向代理服务器

2301_80277275的博客 1243

Golang网络编程实战

Golang网络编程实例

曲折旅程,艰难人生 781

Linux网络编程:NAT、代理服务、内网穿透和打洞

但如果局域网中的多台主机同时访问同一个外网服务,当路由器收到外网发来的响应数据时,路由器无法判断该响应数据应该转发给局域网中的哪台主机,因为该局域网中所有主机的数据包都由路由器代替发送了,因此发来的响应数据包的目的IP地址都是路由器的WAN口IP地址。此时当局域网中的多台主机同时访问同一个外网服务时,虽然外网发来的响应数据的目的IP地址都是路由器的WAN口IP,但发给局域网中不同主机的响应数据对应的目的端口号是不同的,此时路由器就能通过IP+Port的方式来区分发给不同主机的数据包。

_dindong的博客 884

java udp 穿透_Java UDP穿透NAT试验

早就听说用UDP穿透NAT可以解决P2P软件中的两个通过NAT上网的客户端直接通信的问题。当然,需要一个中介来帮助找到对方。终于用Java做了这个试验。代码贴出来吧。UDPAgent.java:import java.io.BufferedReader;import java.io.InputStreamReader;import java.net.DatagramPacket;import ja...

weixin_42097450的博客 231

ASP根据IP来判断跳转页面

<!--google_ad_client = "pub-4490194096475053";/* 内容页,300x250,第一屏 */google_ad_slot = "3685991503";google_ad_width = 300;google_ad_height = 250;//--><script type="text/javascript"src="

管子(zero)的杂乱空间 1444
上一篇: SMTP命令学习
下一篇: Owned Windows:窗口所有者
bukebushuo
博客等级 码龄26年 15粉丝 45原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值