格式可以参考以下url中的内容:
  http://www.vckbase.net/document/viewdoc/?id=853
  http://www.vckbase.net/document/viewdoc/?id=852

upd Sock5代理下的包数据:

client:
      ver( 1 byte)+num method( 1 byte)+ methods(1 -255 byte)
      (05 02 00 02)

server:
     
      ver( 1 byte)+ num method(1 byte)
      (05 00 ) or ( 05 02)

*client( 当返回 02 时):
      
      ver(1  byte)+ name len(1 byte) +name (1-255 byte) +pass len(1 byte)+password(1 -255 byte)
      ( 01 01 61 01 61)

*server( 当返回 02 时):
      ver(1 byte)+status(1 byte)
      (05 00  )or (05 XX)

client:
     
      ver( 1 byte)+cmd(1 byte)+rsv( 1 byte)+address type( 1 byte)+ addrss( ?? byte) +port( 2 byte)

(05 03 00 01 7f 00 00 01 0f A0)

server:
      ver(1 byte)+reponse(1 byte)+rsv(1 byte)+address type(1 byte)+address(?? byte)+port( 2 byte)
      (05 00 00 01 7f 00 00 01 0f A0)

client:
     rsv (2 byte) + fragment( 1 byte)+ address type (1 byte)+ addr(?? byte)+ port( 2 byte) +data(??)
     (00 00 00 01 7f 00 00 01 0f a0 .....)
  server:
     rsv (2 byte) + fragment( 1 byte)+ address type (1 byte)+ addr(?? byte)+ port( 2 byte) +data(??)
     (00 00 00 01 7f 00 00 01 0f a0 .....)
   ....

test server代码:
   
SOCKET s=socket(AF_INET,SOCK_DGRAM,0);
if(s==INVALID_SOCKET)
{
   closesocket(s);
   return 0;
}
struct sockaddr_in addr;
addr.sin_family=AF_INET;
addr.sin_addr.s_addr=ADDR_ANY;
addr.sin_port=htons(4000);
if(bind(s,(struct sockaddr *)&addr,sizeof(struct sockaddr))==SOCKET_ERROR)
{
   closesocket(s);
   return 0;
}

while(1==1)
{
   char sz_buf[1024];
   struct sockaddr in;
   int    n_len=sizeof(struct sockaddr);
   if(recvfrom(s,sz_buf,1024,0,(struct sockaddr *)&in,&n_len)==SOCKET_ERROR)
   {
      closesocket(s);
      return 0;
   }

if(sendto(s,"Hello World",strlen("Hello World"),0,(struct sockaddr *)&in,sizeof(struct sockaddr_in))==SOCKET_ERROR)
   {
      closesocket(s);
      return 0;
   }
}

closesocket(s);
return 0;

test client:

SOCKET s=socket(AF_INET,SOCK_DGRAM,0);
if(s==INVALID_SOCKET)
{
   closesocket(s);
   return;
}

struct sockaddr_in addr1;
addr1.sin_family=AF_INET;
addr1.sin_addr.s_addr=ADDR_ANY;
addr1.sin_port=htons(4001);
if(bind(s,(struct sockaddr *)&addr1,sizeof(struct sockaddr_in))==SOCKET_ERROR)
{
   closesocket(s);
   return;
}

zf5_sock5_udp udp;
strcpy(udp.m_sz_name,"a");
strcpy(udp.m_sz_pass,"a");
if(udp.connect_sock5_udp("127.0.0.1",1080,&addr1)<0)
{
   closesocket(s);
   return;
}

struct sockaddr_in addr2;
addr2.sin_family=AF_INET;
addr2.sin_addr.s_addr=inet_addr("127.0.0.1");
addr2.sin_port=htons(4000);
if(udp.send_sock5_udp(s,"hello",strlen("hello"),&addr2)<0)
{
  closesocket(s);
  return;
}

char sz_buf[1024]="";
memset(sz_buf,0,1024);
struct sockaddr_in addr3;
if(udp.recv_sock5_udp(s,sz_buf,&addr3)<0)
{
   closesocket(s);
   return;
}

AfxMessageBox(sz_buf);
return;

zf5_sock5_udp.h文件:

#pragma once
#pragma comment(lib,"ws2_32.lib")

#include <winsock2.h>
#define ZF5_BUFFER_SIZE1 255
#define ZF5_BUFFER_SIZE2 1024
#define ZF5_BUFFER_SIZE3 8192
class zf5_sock5_udp
{
public:

//构造函数
  zf5_sock5_udp(void);

//析构函数
  virtual ~zf5_sock5_udp(void);

//创建sock5的upd代理
  int  connect_sock5_udp(char *sz_addr_proxy,int n_port_proxy,struct sockaddr_in *p_addr);

//通过sock5发送udp数据
  int  send_sock5_udp(int s_udp,char *sz_buf,int n_len,struct sockaddr_in *p_addr);

//通过sock5接收udp数据
  int  recv_sock5_udp(int s_udp,char *sz_buf,struct sockaddr_in *p_addr);
 
  //关闭sock5的udp代理
  int  close_sock5_udp();
 
  //代理服务器用户名称
  char m_sz_name[ZF5_BUFFER_SIZE1+2];
 
  //代理服务器用户密码
  char m_sz_pass[ZF5_BUFFER_SIZE1+2];

private:
  //远端udp服务器地址
  char m_sz_udp_srv[ZF5_BUFFER_SIZE2+2];
 
  //远端udp服务器端口
  int  m_n_port;
 
  //地址类型
  int  m_n_addrtype;
 
  //sock5代理的tcp连接
  int  m_n_sock5;
};

zf5_sock5_udp.cpp文件:

#include "stdafx.h"
#include "./zf5_sock5_udp.h"

//构造函数
zf5_sock5_udp::zf5_sock5_udp(void)
{
 WSADATA wsa;
 WSAStartup(MAKEWORD(1,1),&wsa);
 m_n_addrtype=-1;
 m_n_port=0;
 m_n_sock5=INVALID_SOCKET;
 m_sz_name[0]=0;
 m_sz_pass[0]=0;
 m_sz_udp_srv[0]=0;

}

//析构函数
zf5_sock5_udp::~zf5_sock5_udp(void)
{
 close_sock5_udp();
 WSACleanup();
}

//创建sock5的upd代理
int  zf5_sock5_udp::connect_sock5_udp(char *sz_addr_proxy,int n_port_proxy,struct sockaddr_in *p_addr)
{
 SOCKET s_sock5_tcp=INVALID_SOCKET;

s_sock5_tcp=socket(AF_INET,SOCK_STREAM,0);
 if(s_sock5_tcp==INVALID_SOCKET)
 {
  return -1;
 }
 
 timeval tv;
 tv.tv_sec=10;
 tv.tv_usec=0;
 if(setsockopt(s_sock5_tcp,SOL_SOCKET,SO_RCVTIMEO,(char *)&tv,sizeof(timeval))==SOCKET_ERROR)
 {
  closesocket(s_sock5_tcp);
  return -1;
 }

struct sockaddr_in sa_1;
 sa_1.sin_family=AF_INET;
 sa_1.sin_addr.s_addr=inet_addr(sz_addr_proxy);
 sa_1.sin_port=htons(n_port_proxy);
 if(sa_1.sin_addr.s_addr==INADDR_NONE)
 {
  struct hostent *p=gethostbyname(sz_addr_proxy);
  if(p==NULL)
  {
   closesocket(s_sock5_tcp);
   return -1;
  }
  sa_1.sin_addr.s_addr=((LPIN_ADDR)p->h_addr)->s_addr;
 }

if(connect(s_sock5_tcp,(struct sockaddr *)&sa_1,sizeof(struct sockaddr_in))==SOCKET_ERROR)
 {
  closesocket(s_sock5_tcp);
  return -1;
 }

char sz_buf[ZF5_BUFFER_SIZE2+2];

memset(sz_buf,0,ZF5_BUFFER_SIZE2);
 sz_buf[0]=0x05;
 sz_buf[1]=0x02;
 sz_buf[2]=0x00;
 sz_buf[3]=0x02;
 if(send(s_sock5_tcp,sz_buf,4,0)==SOCKET_ERROR)
 {
  closesocket(s_sock5_tcp);
  return -1;
 }

memset(sz_buf,0,ZF5_BUFFER_SIZE2);
 if(recv(s_sock5_tcp,sz_buf,ZF5_BUFFER_SIZE2,0)==SOCKET_ERROR)
 {
  closesocket(s_sock5_tcp);
  return -1;
 }

if(sz_buf[0]==0x05&&sz_buf[1]==0x02)
 {
  int n_temp1=0;
  int n_temp2=0;
  memset(sz_buf,0,ZF5_BUFFER_SIZE2);
  n_temp1=strlen(m_sz_name);
  sz_buf[0]=0x01;
  sz_buf[1]=n_temp1;
  memcpy((void *)&(sz_buf[2]),(void *)&(m_sz_name[0]),n_temp1);
  n_temp2=strlen(m_sz_pass);
  sz_buf[1+n_temp1+1]=n_temp2;
  memcpy((void *)&(sz_buf[1+n_temp1+2]),(void *)&(m_sz_pass[0]),n_temp2);
  if(send(s_sock5_tcp,sz_buf,n_temp1+n_temp2+3,0)==SOCKET_ERROR)
  {
   closesocket(s_sock5_tcp);
   return -1;
  }

memset(sz_buf,0,ZF5_BUFFER_SIZE2);
  if(recv(s_sock5_tcp,sz_buf,ZF5_BUFFER_SIZE2,0)==SOCKET_ERROR)
  {
   closesocket(s_sock5_tcp);
   return -1;
  }

if(sz_buf[0]!=0x01||sz_buf[1]!=0x00)
  {
   closesocket(s_sock5_tcp);
   return -1;
  }
 }
 else if(sz_buf[0]!=0x05||sz_buf[1]!=0x00)
 {
  closesocket(s_sock5_tcp);
  return -1;
 }

memset(sz_buf,0,ZF5_BUFFER_SIZE2);
 sz_buf[0]=0x05;
 sz_buf[1]=0x03;
 sz_buf[2]=0x00;
 sz_buf[3]=0x01;

*((int *)(&sz_buf[4]))=p_addr->sin_addr.s_addr;
 *((short *)(&(sz_buf[8])))=(short)p_addr->sin_port;

if(send(s_sock5_tcp,sz_buf,10,0)==SOCKET_ERROR)
 {
  closesocket(s_sock5_tcp);
  return -1;
 }

memset(sz_buf,0,ZF5_BUFFER_SIZE2);
 if(recv(s_sock5_tcp,sz_buf,ZF5_BUFFER_SIZE2,0)==SOCKET_ERROR)
 {
  closesocket(s_sock5_tcp);
  return -1;
 }

if(sz_buf[0]!=0x05||sz_buf[1]!=0x00)
 {
  closesocket(s_sock5_tcp);
  return -1;
 }

if(sz_buf[3]==0x01)
 {
  int n_ip=*((int *)&sz_buf[4]);
  struct in_addr in;
  in.S_un.S_addr=n_ip;
  memset((void *)m_sz_udp_srv,0,sizeof(m_sz_udp_srv));
  strcpy(m_sz_udp_srv,inet_ntoa(in));
  m_n_port=htons(*((short *)&(sz_buf[8])));
  m_n_addrtype=0x01;
 }
 else if(sz_buf[3]==0x03)
 {
  memset((void *)m_sz_udp_srv,0,sizeof(m_sz_udp_srv));
  strncpy(m_sz_udp_srv,&sz_buf[5],sz_buf[4]);
  m_n_port=htons(*((short *)&(sz_buf[5+sz_buf[4]])));
  m_n_addrtype=0x03;
 }
 else
 {
  closesocket(s_sock5_tcp);
  return -1;
 }

m_n_sock5=s_sock5_tcp;

return 0;
}

//通过sock5发送udp数据
int  zf5_sock5_udp::send_sock5_udp(int s_udp,char *sz_buf,int n_len,struct sockaddr_in *p_addr)
{
 char sz_buf1[ZF5_BUFFER_SIZE3+2];
 int  n_len1=0;
 sz_buf1[0]=0x00;
 sz_buf1[1]=0x00;
 sz_buf1[2]=0x00;
 sz_buf1[3]=0x01;
    memcpy((void *)&sz_buf1[4],(void *)&(p_addr->sin_addr.s_addr),4);
    memcpy((void *)&sz_buf1[8],(void *)&(p_addr->sin_port),2);
 struct sockaddr_in addr;
 addr.sin_family=AF_INET;
 addr.sin_addr.s_addr=inet_addr(m_sz_udp_srv);
 addr.sin_port=htons(m_n_port);
 if(addr.sin_addr.s_addr==INADDR_NONE)
 {
  struct hostent *p=gethostbyname(m_sz_udp_srv);
  if(p==NULL)
  {
   return -1;
  }
  addr.sin_addr.s_addr=((LPIN_ADDR)p->h_addr)->s_addr;
 }

memcpy(&sz_buf1[10],sz_buf,n_len);

int n_ret=-1;
 n_ret=sendto(s_udp,sz_buf1,n_len+10,0,(struct sockaddr *)&addr,sizeof(struct sockaddr_in ));

return n_ret;
}

//通过sock5接收udp数据
int  zf5_sock5_udp::recv_sock5_udp(int s_udp,char *sz_buf,struct sockaddr_in *p_addr)
{
 char sz_buf1[ZF5_BUFFER_SIZE3+2];
 struct sockaddr_in addr;
 int n_ret=-1;
 int n_len1=0;
 int n_len2=sizeof(struct sockaddr_in);
 n_ret=recvfrom(s_udp,sz_buf1,ZF5_BUFFER_SIZE3,0,(struct sockaddr *)&addr,&n_len2);
 if(n_ret==SOCKET_ERROR)
 {
  return -1;
 }

if(sz_buf1[3]==0x01)
 {
  p_addr->sin_family=AF_INET;
  p_addr->sin_addr.s_addr=*((int *)&(sz_buf1[4]));
  p_addr->sin_port=*((short *)&(sz_buf1[8]));
  n_ret-=10;
  memcpy(sz_buf,&sz_buf1[10],n_ret);
 }
 else if(sz_buf1[3]==0x03)
 {
  char sz_buf2[ZF5_BUFFER_SIZE2+2];
  memset(sz_buf2,0,ZF5_BUFFER_SIZE2);
  strncpy(sz_buf2,sz_buf2,sz_buf1[4]);
  struct hostent *p=gethostbyname(sz_buf2);
  if(p==NULL)
  {
   return -1;
  }
  n_len1=4+sz_buf1[4];
  p_addr->sin_family=AF_INET;
  p_addr->sin_addr.s_addr=((LPIN_ADDR)p->h_addr)->s_addr;
  p_addr->sin_port=*((short *)&(sz_buf1[n_len1]));
 
  n_ret-=(n_len1+2);
  memcpy((void *)sz_buf,(void *)&sz_buf1[n_len1],n_ret);

n_ret-=(4+2+1+sz_buf1[4]);
 }
 else
 {
  return -1;
 }

return n_ret;
}

//关闭sock5的udp代理
int  zf5_sock5_udp::close_sock5_udp()
{
 if(m_n_sock5!=INVALID_SOCKET)
 {
  closesocket(m_n_sock5);
  m_n_sock5=INVALID_SOCKET;
 }

return 0;
}

UDP下的SOCK5代理实现相关推荐

  1. VB.Net2010 下的sock5代理实现

    文章转载自 [http://blog.csdn.net/wuxing1129/article/details/4514650] Imports System.Net Imports System.Ne ...

  2. 如何在Linux系统环境下配置s5代理(socks5代理)?

    今天小编给大家分享一下Linux中怎么部署Socks5代理服务器的相关知识点,内容详细,逻辑清晰,在 Linux 操作系统中,配置 socks5 代理可以帮助你在网络中更加安全和自由地浏览互联网. 本 ...

  3. sock5代理工作原理

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! sock ...

  4. centos6部署sock5代理软件dante

    一.socks简介 socks是一种网络传输协议,主要用于客户端与外网服务器之间通讯的中间传递.根据OSI七层模型来划分,SOCKS属于会话层协议,位于表示层与传输层之间.当防火墙后的客户端要访问外部 ...

  5. sock5代理 数据包格式

    sock5代理的工作程序是: (转贴) 1.需要向代理方服务器发出请求信息. 2.代理方应答 3.需要代理方接到应答后发送向代理方发送目的ip和端口 4.代理方与目的连接 5.代理方将需要代理方发出的 ...

  6. ubuntu下chrome以代理模式启动

    ubuntu下chrome以代理模式启动 google-chrome --proxy-server=socks5://127.0.0.1:1080 chromium浏览器 chromium-brows ...

  7. 若依前后端分离版本,Windows下使用Nginx代理的方式进行部署(全流程,图文教程)

    场景 若依官网: http://doc.ruoyi.vip/ 前提: 服务器上安装Mysql,并将数据库导入,在SpringBoot中的application-druid.yml配置mysql数据库连 ...

  8. .NET 下基于动态代理的 AOP 框架实现揭秘

    .NET 下基于动态代理的 AOP 框架实现揭秘 Intro 之前基于 Roslyn 实现了一个简单的条件解析引擎,想了解的可以看这篇文章 基于 Roslyn 实现一个简单的条件解析引擎 执行过程中会 ...

  9. Ubuntu 下使用SSH 代理

    Ubuntu 下使用SSH 代理 公司有一个服务器在 圣地亚哥,下载速度超快,几个M的,且可以访问youtube,facebook,而从我这访问这个服务器速度也很快 ,scp 也能达到 1M/s . ...

最新文章

  1. CentOS7.4到Elasticsearch一路坑(五)
  2. python opencv 图像膨胀
  3. 超级vga显示卡_VGA 显示卡简介
  4. MERGE INTO
  5. 常见DDoS技术方法和对应防御措施
  6. corners边框_第11天|16天搞定前端,CSS的圆角边框,让人赏心悦目
  7. 一年赚4.5亿,网红盲盒公司泡泡玛特再战IPO
  8. erp系统是什么东西
  9. fpga一个按键控制跑马灯启停_车上这些开关都认识吗?一次带你认清车上按键...
  10. mqtt server python_Python使用mqtt极简例子
  11. 客户端验证的极品--jQuery.validator
  12. Pr常见问题,pr素材脱机后该如何恢复?
  13. element-UI快速上手例子运行失败
  14. grub4dos 制作WIN7、WINPE2003、Ubuntu、dos工具箱多启动U盘 (不量产)
  15. 成都大数据培训前景:2020年大数据趋势
  16. 层次分析法php,使用层次分析法,需要求矩阵的最大特征根入max
  17. 恒生电子2019校园招聘笔试题
  18. Android X86上运行基于ARMARM处理器的应用程序
  19. python 小括号 运算_浅析python 中大括号中括号小括号的区分
  20. Zigbee疑难问题定位以及思路方法分享 (一)

热门文章

  1. Turtlebot4入门教程-演示-导航
  2. python怎么遍历文件夹内的删除文件_python遍历文件夹并删除特定格式文件的示例...
  3. 成功之前,大佬都在干什么
  4. python 错误:KeyError
  5. Linux用户分组管理的常用操作笔记
  6. vue 同一页面多次引用同一组件
  7. LC.746 使用最小花费爬楼梯
  8. 超码、候选码、主码、主属性、非主属性
  9. 智能推荐助力南瓜电影打造私人定制影院
  10. dell precision3551电脑安装win10+ubuntu