分享
 
 
 

UDP下的SOCK5代理实现

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

Author:zfive5(zhaozidong)

Email :zfive5@yahoo.com.cn

前些时间,以前同事叫我帮忙写一个upd下的sock5代理,由于一些原因

没有帮成他的忙,我在这里再次对他说抱歉! 关于sock5代理的包文和数据

格式可以参考以下url中的内容:

http://www.vckbase.net/document/viewdoc/?id=853

http://www.vckbase.net/document/viewdoc/?id=852

http://www.china-pub.com/computers/eMook/emooknew/rfctxt/RFC1928.txt

牙看来还是拔不了呀!医院的口腔科星期天居然没有人!!!大早晨在公交车

上一来一回8圆钱啊!

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;

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有