歡迎您光臨本站 註冊首頁

?檳愕?Q造一??SOCK5 PROXY(Gcc篇)之一

←手機掃碼閱讀     火星人 @ 2014-03-12 , reply:0
  ?檳愕?Q造一??SOCK5 PROXY(Gcc篇)之一

作者: ?氏??(http://chiosoft.51.net)
E-mail: chiosoft@163.net
※???註明出?※


本文以QQ??ο?教你如何??一??SOCK5 PROXY

一、??涔ぷ?br>===================
1.??器:
?樘岣叱絛虻目梢浦殘院捅苊?S秋後算??本文?⑹褂?CC作?榫??器,Win32版的GCC可到www.mingw.org下?,或者用Dev-C++自?У?CC也行.

2.程序?行?境:
可在Windows 2000/XP和LINUX下?行,Win9x系??]??,不知行不行.

3.如何??:
在LINUX下用 gcc mysock5.c -o mysock5
在Win32下用 gcc mysock5.c -o mysock5.exe -lwsock32
其中一定要加???lwsock32?碇該魘褂?indows Socket相?的??否?t???r??鰣e,在Linux下??不用.


二、基本思路
===================
Proxy是什??我想不用我多?吧,?是?上?入正?吧.SOCK5是一?Proxy?f?,支持TCP和UDP?f?,也是QQ唯一支持的Proxy?型,?情可?㈤?rfc1928.txt.

1.握手?程
客?舫絛蛞?褂?ROXY服??首先要跟PROXY SERVER?行握手,????程是基於TCP/IP?f?.

2.?料?鬏?
QQ是使用UDP??魎唾Y料的,所以?QQ和SOCK5 PROXY握手成功後,就??D向?接一??UDP SOCKET,也就是?我?????程序首先要建立一??TCP SOCKET和QQ?行握手,然後再要建立一??UDP SOCKET?磉M行???修D,???代理服?盞墓δ?

?是一??最??蔚?ROXY,只支持一??用?暨B接一次,?接中止後需退出重新???


三、程序框架
===================
先看看源代?mysock5.c

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>

//Windows和LINUX系?所提供的Socket API不一??需要分?e?明
#ifdef _WIN32
#include <winsock2.h>
#include <wininet.h>
#else
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netdb.h>
#endif

//定?一段???^
#define BUFSZ 65535
char buf[ BUFSZ ];

int main(int argc, char** argv)
{
//?是Server的?料,包括IP地址以及用作TCP和UDP?接的埠?
short tcp_proxy_port=8888, udp_proxy_port=8811;
char udp_proxy_ip[]="127.0.0.1";
short clt_udp_port;

//在Windows系?下,使用??前要先用WSAStartup()?磉M行初始化,
//WSA是Windows Socket API的意思,本文使用WinSock 2.0版本
//在VC中可以用WINSOCK_VERSION?碇付ò奼?不?GCC FOR WIN32?]有定????宏
//我??需要自己指定
#ifdef _WIN32
WSADATA WSAData;
if( WSAStartup(0x0110, &WSAData) ) {
//if( WSAStartup(WINSOCK_VERSION, &WSAData) ) {
p_error("WSA error");
exit(-1);
}
#endif


//??右??TCP SOCKET,用?硨?Q?行握手,?K??QQ用?硨臀???賢ǖ?DP埠?(clt_udp_port)
Launch_TCP( tcp_proxy_port, udp_proxy_ip, udp_proxy_port, &clt_udp_port );

//握手成功後,??右??UDP SOCKET,用作???鬏?,是真正起PROXY作用的部份
Launch_UDP( udp_proxy_port, udp_proxy_ip, clt_udp_port );

return 0;
}




四、工具函??br>===================
正所?工欲善其事,必先利其器,好的程序?然不能缺乏好的工具函??有了?些函???行??就更加方便了.

1. p_error
?是一???理??信息的函??把所有的??信息集中用一??函??硤?理是一??好??T,目前我??直接用printf()?⑵漭?出,?然也可以?出到文件或者乾脆把它忽略:)

void p_error( const char *err_msg )
{
printf( "ERR=>%s\n", err_msg );
}



2. debug_showbin
用?磔?出一段????熱?16?制)

void debug_showbin( const char *dbuf, int n, const char *name, const char *end )
{
int i;

printf( "%s ==> %d bytes: ", name, n );

for( i=0; i<n; i++ )
printf( "(0x%x)", (unsigned char)dbuf[i] );

printf( "%s", end );
}



3. debug_showip
用?盹@示sockaddr_in?型???械?P和Port

void debug_showip( const struct sockaddr_in *dbuf, const char *name, const char *end )
{
printf("[ %s ==> %s:%u ]%s", name, inet_ntoa(dbuf->sin_addr), ntohs(dbuf->sin_port), end

);
}



五、?y?
===================
下?源代?後可?L???,然後?絛?看看有?]有??信息:)


下?本章的源代? → mysock5_1.c



[火星人 ] ?檳愕?Q造一??SOCK5 PROXY(Gcc篇)之一已經有348次圍觀

http://coctec.com/docs/program/show-post-71951.html