关于系统不支持 redisSOCKS5代理的问题

Socks5代理怎么支持SSL??大家讨论下,顶着有分啊
[问题点数:100分,结帖人chary8088]
Socks5代理怎么支持SSL??大家讨论下,顶着有分啊
[问题点数:100分,结帖人chary8088]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
匿名用户不能发表回复!|socks5代理解决方法(3) - VC/MFC当前位置:& &&&socks5代理解决方法socks5代理解决方法(3)www.MyException.Cn&&网友分享于:&&浏览:114次
memset(&sProxyReq1, NULL, sizeof(Sock5Req1));
sProxyReq1.Ver
sProxyReq1.nMethods
sProxyReq1.Methods[0]
sProxyReq1.Methods[1]
pClientSocket-&Send( &sProxyReq1, sizeof(Sock5Req1));
//接收并判断
buff[600]={NULL};
pClientSocket-&Receive(buff,600);
*psProxyAns1;
psProxyAns1
if(psProxyAns1-&Ver
(psProxyAns1-&Method!=0
psProxyAns1-&Method!=2))
//需要验证,发用户名,密码数据包
if(psProxyAns1-&Method
strUserName.GetLength();;
strPwd.GetLength();
char pSendBuf[600]={NULL};
pSendBuf[0]=1;
pSendBuf[1]=nUserL
memcpy(pSendBuf+2,
(LPCTSTR)strUserName,nUserLen);
pSendBuf[2+nUserLen]=nPassL
memcpy(pSendBuf+3+nUserLen,(LPCTSTR)strPwd,nPassLen);
int nSendLen = 3+nUserLen+nPassL
pClientSocket-&Send(pSendBuf,
3+nUserLen+nPassLen);
char buff[600]={NULL};
pClientSocket-&Receive(buff,600);
*psAuthAns = NULL;
if(psAuthAns-&Ver
psAuthAns-&Status
CString strError
_T(&代理服务器用户验证不成功!&);
//第二次验证
sProxyReq2;
memset(&sProxyReq2, NULL, sizeof(Sock5Req2) );
sProxyReq2.Ver
sProxyReq2.Cmd
sProxyReq2.Rsv
sProxyReq2.Atyp
sProxyReq2.IPAddr =
inet_addr((LPCTSTR)strProxyIP);
sProxyReq2.Port
ntohs(nProxyPort);
pClientSocket-&Send( &sProxyReq2,sizeof(struct
Sock5Req2));
//接收并验证
memset(buff,0,600);
pClientSocket-&Receive(buff,600);
*psProxyAns2 = NULL;
psProxyAns2
if(psProxyAns2-&Ver
psProxyAns2-&Rep
buff[600] = {NULL};
&%s%s:%d%s&,&CONNECT
&, (LPCTSTR)strProxyIP, nProxyPort, &
HTTP/1.1\r\nUser-Agent:
MyApp/0.1\r\n\r\n&);
pClientSocket-&Send(buff,strlen(buff));
//发送请求
char pRcvBuf[1024]={NULL};
pClientSocket-&Receive(pRcvBuf,600);
TRACE(pRcvBuf);
//if(strstr(pRcvBuf,
&HTTP/1.0 200 Connection established&)
//连接不成功
if( NULL != strstr(pRcvBuf,
&HTTP/1.0 200&) || NULL != strstr(pRcvBuf,
&HTTP/1.1 200&) ||&
NULL != strstr(pRcvBuf,
&http/1.0 200&) || NULL != strstr(pRcvBuf,
&http/1.1 200&))
//连接成功
}} 共&3&页:
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有Access denied | x95.org used Cloudflare to restrict access
Please enable cookies.
What happened?
The owner of this website (x95.org) has banned your access based on your browser's signature (41219daa8fdc1ecb-ua98).没有更多推荐了,
不良信息举报
举报内容:
SOCKS5代理原理探索
举报原因:
原文地址:
原因补充:
最多只允许输入30个字
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!新手园地& & & 硬件问题Linux系统管理Linux网络问题Linux环境编程Linux桌面系统国产LinuxBSD& & & BSD文档中心AIX& & & 新手入门& & & AIX文档中心& & & 资源下载& & & Power高级应用& & & IBM存储AS400Solaris& & & Solaris文档中心HP-UX& & & HP文档中心SCO UNIX& & & SCO文档中心互操作专区IRIXTru64 UNIXMac OS X门户网站运维集群和高可用服务器应用监控和防护虚拟化技术架构设计行业应用和管理服务器及硬件技术& & & 服务器资源下载云计算& & & 云计算文档中心& & & 云计算业界& & & 云计算资源下载存储备份& & & 存储文档中心& & & 存储业界& & & 存储资源下载& & & Symantec技术交流区安全技术网络技术& & & 网络技术文档中心C/C++& & & GUI编程& & & Functional编程内核源码& & & 内核问题移动开发& & & 移动开发技术资料ShellPerlJava& & & Java文档中心PHP& & & php文档中心Python& & & Python文档中心RubyCPU与编译器嵌入式开发驱动开发Web开发VoIP开发技术MySQL& & & MySQL文档中心SybaseOraclePostgreSQLDB2Informix数据仓库与数据挖掘NoSQL技术IT业界新闻与评论IT职业生涯& & & 猎头招聘IT图书与评论& & & CU技术图书大系& & & Linux书友会二手交易下载共享Linux文档专区IT培训与认证& & & 培训交流& & & 认证培训清茶斋投资理财运动地带快乐数码摄影& & & 摄影器材& & & 摄影比赛专区IT爱车族旅游天下站务交流版主会议室博客SNS站务交流区CU活动专区& & & Power活动专区& & & 拍卖交流区频道交流区
丰衣足食, 积分 920, 距离下一级还需 80 积分
论坛徽章:0
过年的时候在linux平台写了一个简单的socks5代理程序,只实现了tcp的connect方法。前几天5,1放假没事情做,把它迁移到了windows平台。但是我在测试windows平台和linux的代码时,都有一些问题。主要表现在请求一个页面打开得总是不完整,全部打开的情况比较少……但是就程序而言看不出来什么bug,麻烦各位看看,谢谢了。本来是发在csdn了,后来才觉得那种地方本来就不该去。linux的代码我弄丢了,现在只剩下windows的了,不过这个没什么难度,linux,windows都是一样,系统而已。
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Socks5代理头文件,定义协议相关数据包结构
// 版本 0.1,作者 云舒
// 日凌晨1点15分,GF回家已经11天了。
//
// 参考:
//& && && && &&&http://www.rfc-editor.org/rfc/rfc1928.txt
//& && && && &&&http://www.rfc-editor.org/rfc/rfc1929.txt
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef SOCKS5_H
#define SOCKS5_H
#define VERSION& & & & & & & & 0x05& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & // 代理协议版本
#define CONNECT& & & & & & & & 0x01& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & // connect方法
#define IPV4& & & & & & & & 0x01
#define DOMAIN& & & & & & & & 0x03
#define IPV6& & & & & & & & 0x04
typedef struct _method_select_response& && && && && && &// 协商方法服务器响应
{
& && &&&char& & & & & & & & & & & && & & & & & & & & & & & & & & & & & & & & & & & // 服务器支持的Socks版本,0x04或者0x05
& && &&&unsigned char& & & & select_& & & & & & & & & & & & & & & & & & & & // 服务器选择的方法,0x00为匿名,0x02为密码认证
} METHOD_SELECT_RESPONSE;
typedef struct _method_select_request& && && && && && & // 协商方法服务端请求
{
& && &&&char& && && && && && && && && && && &&&// 客户端支持的版本,0x04或者0x05
& && &&&char& & number_& && && && && && && && & // 客户端支持的方法的数量
& && &&&char& & methods[255];& && && && && && && && && &// 客户端支持的方法类型,最多255个,0x00为匿名,0x02为密码认证
} METHOD_SELECT_REQUEST;
typedef struct _AUTH_RESPONSE& && && && && && && && && &// 用户密码认证服务端响应
{
& && &&&char& && & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & // 版本,此处恒定为0x01
& && &&&char& && & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & // 服务端认证结果,0x00为成功,其他均为失败
} AUTH_RESPONSE;
typedef struct _AUTH_REQUEST& & & & & & & & & & & & & & & & & & & & & & & & & & & & // 用户密码认证客户端请求
{
& && &&&char& && & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & // 版本,此处恒定为0x01
& & char& && &&&name_& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & // 第三个字段用户名的长度,一个字节,最长为0xff
& & char& && &&&name[255];& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & // 用户名
& & char& && &&&pwd_& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & // 第四个字段密码的长度,一个字节,最长为0xff
& & char& && &&&pwd[255];& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & // 密码
} AUTH_REQUEST;
typedef struct _SOCKS5_RESPONSE& & & & & & & & & & & & & & & & & & & & & & & & & & & & // 连接真实主机,Socks代理服务器响应
{
& & char& && &&&& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & // 服务器支持的Socks版本,0x04或者0x05
& & char& && &&&& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & // 代理服务器连接真实主机的结果,0x00成功
& & char& && &&&& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & // 保留位,恒定位0x00
& & char& && &&&address_& & & & & & & & & & & & & & & & & & & & & & & & & & & & // Socks代理服务器绑定的地址类型,IP V4为0x00,IP V6为0x04,域名& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & //为0x03
& & char& && &&&address_port[1];& & & & & & & & & & & & & & & & & & & & & & & & // 如果address_type为域名,此处第一字节为域名长度,其后为域名本& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & //身,无0字符结尾
}SOCKS5_RESPONSE;& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & // 身,域名后为Socks代理服务器绑定端口
typedef struct _SOCKS5_REQUEST& & & & & & & & & & & & & & & & & & & & & & & & & & & & // 客户端请求连接真实主机
{
& & & & char& & & & & & & && & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & // 客户端支持的Socks版本,0x04或者0x05
& & char& && &&&& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & // 客户端命令,CONNECT为0x01,BIND为0x02,UDP为0x03,一般为0x01
& & char& && &&&& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & // 保留位,恒定位0x00
& & char& && &&&address_& & & & & & & & & & & & & & & & & & & & & & & & & & & & // 客户端请求的真实主机的地址类型,IP V4为0x00,IP V6为0x04,域名& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & //为0x03
& & char& && &&&address_port[1];& & & & & & & & & & & & & & & & & & & & & & & & // 如果address_type为域名,此处第一字节为域名长度,其后为域名本& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & //身,无0字符结尾
}SOCKS5_REQUEST;& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & // 身,域名后为真实主机绑定端口
#endif
复制代码
实现代码(我就没分成几个文件了):
#include &stdio.h&
#include &winsock2.h&
#include &windows.h&
#include &Socks5.h&
#pragma comment( lib, &ws2_32& )
#define MAX_USER& && &&&10
#define BUFF_SIZE& && & 1024
#define AUTH_CODE& && & 0x02
#define TIME_OUT& && &&&400000& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & // select超时,0.4秒
#define USER_NAME& && & &yunshu&& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & // 代理用户名
#define PASS_WORD& && & &ph4nt0m&& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & // 代理密码
int& &&&need_auth = 0;& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & // 默认不需要密码
// 协商版本和身份认证方法,失败返回-1,否则返回1.
int& & & & & & & & ClientMethod( SOCKET sock, METHOD_SELECT_REQUEST *method_request, METHOD_SELECT_RESPONSE *method_response )
{
& & & & int& & & & ret = -1;
& & & & // 只允许Socks5协议
& & & & method_response-&version = VERSION;
& & & & if( (unsigned int)method_request-&version != VERSION )
& & & & {
& & & & & & & & method_response-&select_method = 0
& & & & & & & & ret = send( sock, (char *)method_response, sizeof(METHOD_SELECT_RESPONSE), 0 );
& & & & & & & & return -1;
& & & & }
& & & & // 发送认证要求到客户端服务端
& & & & if( need_auth == 0 )
& & & & {
& & & & & & & & method_response-&select_method = 0x00;
& & & & }
& & & & else
& & & & {
& & & & & & & & method_response-&select_method = AUTH_CODE;
& & & & }
& & & & ret = send( sock, (char *)method_response, sizeof(METHOD_SELECT_RESPONSE), 0 );
& & & & if( ret != sizeof(METHOD_SELECT_RESPONSE) )
& & & & {
& & & & & & & & return -1;
& & & & }
& & & & return 1;
}
// 验证用户身份,失败返回-1,成功返回1.
int AuthClient( SOCKET sock, AUTH_REQUEST *auth_request, AUTH_RESPONSE *auth_response )
{
& & & & auth_response-&version = 0x01;
& & & & char& & recv_name[256] = { 0 };
& & & & char& & recv_pass[256] = { 0 };
& & & & int& & & & & & & & ret = -1;
& & & & strncpy( recv_name, auth_request-&name, auth_request-&name_len );
& & & & strncpy( recv_pass, &auth_request-&name_len + sizeof(auth_request-&name_len) + (int)auth_request-&name_len + sizeof(auth_request-&pwd_len), auth_request-&pwd_len );
& & & & // 验证帐号和密码
& & & & if( (strncmp( recv_name, USER_NAME, auth_request-&name_len ) == 0) &&
& & & & & & & & & & & & (strncmp( recv_pass, PASS_WORD, auth_request-&pwd_len ) == 0)
& & & & & & & & & & & & )
& & & & {
& & & & & & & & & & & & auth_response-&result = 0x00;
& & & & & & & & & & & & ret = send( sock, (char *)auth_response, sizeof(AUTH_RESPONSE), 0 );
& & & & & & & & & & & & if( ret != sizeof(AUTH_RESPONSE) )
& & & & & & & & & & & & {
& & & & & & & & & & & & & & & & return -1;
& & & & & & & & & & & & }
& & & & }
& & & & else
& & & & {
& & & & & & & & & & & & auth_response-&result = 0x01;
& & & & & & & & & & & & send( sock, (char *)auth_response, sizeof(AUTH_RESPONSE), 0 );
& & & & & & & & & & & & return -1;
& & & & }
& & & & return 1;
}
// 解析socks5命令,只支持connect命令。
// 失败返回-1,成功返回1.
int SplitCmd( SOCKS5_REQUEST *socks5_request, struct sockaddr_in *sin )
{
& & & & // 检测客户端命令中的socks版本
& & & & // 只支持connect命令
& & & & // 必须是IPV4协议
& & & & if( (socks5_request-&version != VERSION) ||
& & & & & & & & (socks5_request-&cmd != CONNECT) ||
& & & & & & & & (socks5_request-&address_type == IPV6) )
& & & & {
& & & & & & & & printf( &connect command error.\n& );
& & & & & & & & return -1;
& & & & }
& & & & memset( (void *)sin, 0, sizeof(struct sockaddr_in) );
& & & & sin-&sin_family = AF_INET;
& & & & // 如果是IPV4地址
& & & & if( socks5_request-&address_type == IPV4 )
& & & & {
& & & & & & & & memcpy( &sin-&sin_addr.s_addr, &socks5_request-&address_type + sizeof(socks5_request-&address_type) , 4 );
& & & & & & & & memcpy( &sin-&sin_port, &socks5_request-&address_type + sizeof(socks5_request-&address_type) + 4, 2 );
& & & & & & & & //printf( &Real Server: %s %d\n&, inet_ntoa( sin-&sin_addr ), ntohs( sin-&sin_port ) );
& & & & }
& & & & else if( socks5_request-&address_type == DOMAIN )
& & & & {
& & & & & & & & char domain_length = *(&socks5_request-&address_type + sizeof(socks5_request-&address_type));
& & & & & & & & char target_domain[ 256] = { 0 };
& & & & & & & & strncpy( target_domain, &socks5_request-&address_type + 2, domain_length );
& & & & & & & & //printf( &target: %s\n&, target_domain );
& & & & & & & & struct hostent *phost = gethostbyname( target_domain );
& & & & & & & & if( phost == NULL )
& & & & & & & & {
& & & & & & & & & & & & & & & & //printf( &Resolve %s error!\n& , target_domain );
& & & & & & & & & & & & & & & & return -1;
& & & & & & & & }
& & & & & & & & memcpy( &sin-&sin_addr , phost-&h_addr_list[0] , phost-&h_length );
& & & & & & & & memcpy( &sin-&sin_port,
& & & & & & & & & & & & &socks5_request-&address_type + sizeof(socks5_request-&address_type) + sizeof(domain_length) + domain_length,
& & & & & & & & & & & & 2 );
& & & & return 1;
}
// 尝试连接到real server,如果失败返回SOCKET_ERROR,成功则返回连接到real server的socket
SOCKET& & & & TestRealServer( SOCKET sock, struct sockaddr_in& & & & sin, SOCKS5_RESPONSE *socks5_response )
{
& & & & // try to connect to real server
& & & & SOCKET& & & & real_server_sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
& & & & if( real_server_sock == INVALID_SOCKET )
& & & & {
& & & & & & & & printf( &Socket creation failed: %d\n&, GetLastError() );
& & & & & & & & closesocket( sock );
& & & & & & & & return SOCKET_ERROR;
& & & & }
& & & & socks5_response-&version = VERSION;
& & & & socks5_response-&reserved = 0x00;
& & & & socks5_response-&address_type = 0x01;
& & & & memset( socks5_response + 4, 0 , 6 );
& & & & int ret = connect( real_server_sock, (struct sockaddr *)&sin, sizeof(sin) );
& & & & if( ret != SOCKET_ERROR )
& & & & {
& & & & & & & & socks5_response-&reply = 0x00;
& & & & & & & & ret = send( sock, (char *)socks5_response, 10, 0 );
& & & & & & & & if( ret != 10 )
& & & & & & & & {
& & & & & & & & & & & & printf( &send result of test real server toclient error: %d\n&, GetLastError() );
& & & & & & & & & & & & closesocket( sock );
& & & & & & & & & & & & return SOCKET_ERROR;
& & & & & & & & }
& & & & }
& & & & else
& & & & {
& & & & & & & & printf( &Connect to real server error: %d\n&, GetLastError() );
& & & & & & & & socks5_response-&reply = 0x01;
& & & & & & & &
& & & & & & & & send( sock, (char *)socks5_response, 10, 0 );
& & & & & & & &
& & & & & & & & closesocket( sock );
& & & & & & & & return SOCKET_ERROR;
& & & & }
& & & & return real_server_
}
void TransferData( SOCKET client_sock, SOCKET real_server_sock )
{
& & & & fd_set& & & & & & & & & & & & fd_
& & & & struct&&timeval& & & & time_
& & & & char& & & & & & & & & & & & recv_buffer[BUFF_SIZE] = { 0 };
& & & & time_out.tv_sec = 0;
& & & & time_out.tv_usec = TIME_OUT;
& & & & while( 1 )
& & & & {
& & & & & & & & FD_ZERO( &fd_read );
& & & & & & & & FD_SET( client_sock, &fd_read );
& & & & & & & & FD_SET( real_server_sock, &fd_read );
& & & & & & & & int ret = select( 0, &fd_read, NULL, NULL, &time_out );
& & & & & & & & if( -1 == ret )
& & & & & & & & {
& & & & & & & & & & & & printf( &select: socket error: %d\n&, GetLastError() );
& & & & & & & & & & & &
& & & & & & & & }
& & & & & & & & else if( 0 == ret )
& & & & & & & & {
& & & & & & & & & & & &
& & & & & & & & }
& & & & & & & & else
& & & & & & & & {
& & & & & & & & & & & & if( FD_ISSET(client_sock, &fd_read) )
& & & & & & & & & & & & {
& & & & & & & & & & & & & & & & memset( recv_buffer, 0, BUFF_SIZE );
& & & & & & & & & & & & & & & & ret = recv( client_sock, recv_buffer, BUFF_SIZE, 0 );
& & & & & & & & & & & & & & & & if( ret != 0 && ret != SOCKET_ERROR )
& & & & & & & & & & & & & & & & {
& & & & & & & & & & & & & & & & & & & & ret = send( real_server_sock, recv_buffer, (int)strlen(recv_buffer), 0 );
& & & & & & & & & & & & & & & & & & & & if( ret == SOCKET_ERROR )
& & & & & & & & & & & & & & & & & & & & {
& & & & & & & & & & & & & & & & & & & & & & & & printf( &send data to real server error: %d\n&, GetLastError() );
& & & & & & & & & & & & & & & & & & & & & & & &
& & & & & & & & & & & & & & & & & & & & }
& & & & & & & & & & & & & & & & }
& & & & & & & & & & & & & & & & else
& & & & & & & & & & & & & & & & {
& & & & & & & & & & & & & & & & & & & & //printf( &recv from client error: %d\n&, GetLastError() );
& & & & & & & & & & & & & & & & & & & &
& & & & & & & & & & & & & & & & }
& & & & & & & & & & & & }
& & & & & & & & & & & & else if( FD_ISSET(real_server_sock, &fd_read) )
& & & & & & & & & & & & {
& & & & & & & & & & & & & & & & memset( recv_buffer, 0, BUFF_SIZE );
& & & & & & & & & & & & & & & & ret = recv( real_server_sock, recv_buffer, BUFF_SIZE, 0 );
& & & & & & & & & & & & & & & & if( ret != 0 && ret != SOCKET_ERROR )
& & & & & & & & & & & & & & & & {
& & & & & & & & & & & & & & & & & & & & ret = send( client_sock, recv_buffer, (int)strlen(recv_buffer), 0 );
& & & & & & & & & & & & & & & & & & & & if( ret == SOCKET_ERROR&&)
& & & & & & & & & & & & & & & & & & & & {
& & & & & & & & & & & & & & & & & & & & & & & & perror( &send data to client error& );
& & & & & & & & & & & & & & & & & & & & & & & &
& & & & & & & & & & & & & & & & & & & & }
& & & & & & & & & & & & & & & & }
& & & & & & & & & & & & & & & & else
& & & & & & & & & & & & & & & & {
& & & & & & & & & & & & & & & & & & & & //printf( &recv from client error: %d\n&, GetLastError() );
& & & & & & & & & & & & & & & & & & & &
& & & & & & & & & & & & & & & & }
& & & & & & & & & & & & }
& & & & & & & & }
& & & & }
& & & & closesocket( client_sock );
& & & & closesocket( real_server_sock );
}
int& &&&Socks5( LPVOID client_sock )
{
& & & & SOCKET& & & & sock = *(int *)client_
& & & & char& & & & recv_buffer[BUFF_SIZE] = { 0 };
& & & & char& & & & reply_buffer[BUFF_SIZE] = { 0 };
& & & & METHOD_SELECT_REQUEST& && && &&&*method_
& & & & METHOD_SELECT_RESPONSE& && && & *method_
& & & & AUTH_REQUEST& && && && && && &&&*auth_
& & & & AUTH_RESPONSE& && && && && && & *auth_
& & & & SOCKS5_REQUEST& && && && && && &*socks5_
& & & & SOCKS5_RESPONSE& && && && && &&&*socks5_
& & & & // 接收来自客户端的方法协商请求
& & & & int ret = recv( sock, recv_buffer, BUFF_SIZE, 0 );
& & & & if( ret & 0 )
& & & & {
& & & & & & & & printf( &recv error: %d\n&, GetLastError() );
& & & & & & & & closesocket( sock );
& & & & & & & & return -1;
& & & & }
& & & & method_request = (METHOD_SELECT_REQUEST *)recv_
& & & & method_response = (METHOD_SELECT_RESPONSE *)reply_
& & & & // 协商版本和是否需要客户端认证身份
& & & & if( -1 == ClientMethod( sock, method_request, method_response ) )
& & & & {
& & & & & & & & closesocket( sock );
& & & & & & & & return -1;
& & & & }
& & & & // 接收客户端的认证信息
& & & & if( need_auth != 0 )
& & & & {
& & & & & & & & memset( recv_buffer, 0, BUFF_SIZE );
& & & & & & & & ret = recv( sock, recv_buffer, BUFF_SIZE, 0 );
& & & & & & & & if( ret & 0 )
& & & & & & & & {
& & & & & & & & & & & & printf( &recv username and password error: %d\n&, GetLastError() );
& & & & & & & & & & & & closesocket( sock );
& & & & & & & & & & & &
& & & & & & & & & & & & return -1;
& & & & & & & & }
& & & & & & & & auth_request = (AUTH_REQUEST *)recv_
& & & & & & & & memset( reply_buffer, 0, BUFF_SIZE );
& & & & & & & & auth_response = (AUTH_RESPONSE *)reply_
& & & & & & & & if( -1 == AuthClient( sock, auth_request, auth_response ) )
& & & & & & & & {
& & & & & & & & & & & & closesocket( sock );
& & & & & & & & & & & & return -1;
& & & & & & & & }
& & & & }
& & & &
& & & & // 接收客户端命令
& & & & memset( recv_buffer, 0, BUFF_SIZE );
& & & & ret = recv( sock, recv_buffer, BUFF_SIZE, 0 );
& & & & if( ret & 0 )
& & & & {
& & & & & & & & printf( &recv connect command error:%d\n&, GetLastError() );
& & & & & & & & closesocket( sock );
& & & &
& & & & & & & & return -1;
& & & & }
& & & &
& & & & socks5_request = (SOCKS5_REQUEST *)recv_
& & & & struct sockaddr_in& & & &
& & & & memset( &sin, 0, sizeof(struct sockaddr_in) );
& & & & // 分析客户端命令
& & & & if( -1 == SplitCmd( socks5_request, &sin ) )
& & & & {
& & & & & & & & closesocket( sock );
& & & & & & & & return -1;
& & & & }
& & & &
& & & & memset( reply_buffer, 0, BUFF_SIZE );
& & & & socks5_response = (SOCKS5_RESPONSE *)reply_
& & & &
& & & & SOCKET& & & & real_server_sock = TestRealServer( sock, sin, socks5_response );
& & & &
& & & & if( SOCKET_ERROR == real_server_sock )
& & & & {
& & & & & & & & return -1;
& & & & }
& & & & TransferData( sock, real_server_sock );
& & & & return 0;
}
int& &&&main( int argc, char *argv[] )
{
& & & & if( argc != 3 && argc != 2 )
& & & & {
& & & & & & & & printf( &Socks5 proxy for test,code by YunShu\n& );
& & & & & & & & printf( &Usage: %s& &&proxy_port&& &[auth]\n&, argv[0] );
& & & & & & & & printf( &Options:\n& );
& & & & & & & & printf( && && &&&&proxy_port&& &&&---which&&port of this proxy server will listen.\n& );
& & & & & & & & printf( && && &&&[auth]& && && &&&---if this proxy need auth,must be 0 or 1, default not.\n& );
& & & & & & & &
& & & & & & & & return 1;
& & & & }
& & & & if( argc == 3 )
& & & & {
& & & & & & & & need_auth = atoi(argv[2]);
& & & & & & & & if( need_auth != 0 && need_auth != 1 )
& & & & & & & & {
& & & & & & & & & & & & printf( &need_auth must be 0 or 1.\n& );
& & & & & & & & & & & & return 1;
& & & & & & & & }
& & & & }
& & & & WSAData& & & & & & & &
& & & & if( 0 != WSAStartup( 0x0202, &wsa ) )
& & & & {
& & & & & & & & printf( &WSAStartup error: %d\n&, GetLastError() );
& & & & & & & & return -1;
& & & & }
& & & & struct sockaddr_in& & & & & & & &
& & & & memset( (void *)&sin, 0, sizeof( struct sockaddr_in) );
& & & & sin.sin_family = AF_INET;
& & & & sin.sin_port = htons( atoi(argv[1]) );
& & & & sin.sin_addr.s_addr = htonl(INADDR_ANY);
& & & & SOCKET listen_sock = socket( AF_INET, SOCK_STREAM, 0 );
& & & & if( listen_sock == INVALID_SOCKET )
& & & & {
& & & & & & & & printf( &Socket creation failed: %d\n&, GetLastError() );
& & & & & & & & return -1;
& & & & }
& & & & if( bind( listen_sock, (struct sockaddr*)&sin, sizeof(struct sockaddr_in) ) == SOCKET_ERROR )
& & & & {
& & & & & & & & printf( &Bind error: %d\n&, GetLastError() );
& & & & & & & & return -1;
& & & & }
& & & & if( listen( listen_sock, MAX_USER ) == SOCKET_ERROR )
& & & & {
& & & & & & & & printf( &Listen error: %d\n&, GetLastError() );
& & & & & & & & return -1;
& & & & }
& & & & struct sockaddr_in& & & & & & & &
& & & & SOCKET& & & & & & & & & & & & & & & & & & & & client_
& & & & int& & & & & & & & & & & & & & & & & & & & & & & & client_len = sizeof( struct sockaddr_in );
& & & & while( client_sock = accept( listen_sock, (struct sockaddr *)&cin, (int *)&client_len ) )
& & & & {
& & & & & & & & //printf( &Connected from %s,processing......\n&, inet_ntoa( cin.sin_addr ) );
& & & & & & & & HANDLE& & & & work_
& & & & & & & & DWORD& & & & thread_
& & & & & & & & work_thread = CreateThread( NULL, 0,
& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & (LPTHREAD_START_ROUTINE)Socks5,
& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & (LPVOID)&client_sock,
& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & 0,
& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & (LPDWORD)(&thread_id) );
& & & & & & & &
& & & & & & & & if( NULL == work_thread )
& & & & & & & & {
& & & & & & & & & & & & & & & & printf( &Create thread error: %d\n&, GetLastError() );
& & & & & & & & & & & & & & & & closesocket( client_sock );
& & & & & & & & }
& & & & & & & & else
& & & & & & & & {
& & & & & & & & & & & & & & & & CloseHandle(work_thread);
& & & & & & & & }
& & & & }
& & & & WSACleanup( );
& & & & return 0;
}
复制代码
丰衣足食, 积分 920, 距离下一级还需 80 积分
论坛徽章:0
说明一下,select函数的用法是没错的,windows平台下面的select第一个参数是忽略的。
我记得在linux下面我写的是这样:
ret = select( (sock & real_server_sock ? sock : real_server_sock) + 1, &fd_read, NULL, NULL, &time_out );
丰衣足食, 积分 920, 距离下一级还需 80 积分
论坛徽章:0
不好意思,自己网上提一下。
是都没兴趣,还是觉得太简单了?
虽然这个是windows平台的,但是和linux的并没什么很大的区别。
我下班了找找看,看能找到linux的那段不。
论坛徽章:105
日凌晨1点15分,GF回家已经11天了。
显然GF 5.1又不在身边, &套套&这种基本工具其实不用自己制造, 用tor就好了, 除非你打算超过它.
白手起家, 积分 75, 距离下一级还需 125 积分
论坛徽章:0
你好,请问楼主,我把你的Linux下的版本拿去测试了下,不知道问题出现在哪,希望能得到你的指点,谢谢!
我是在虚拟机里实现的,网络连接如下:
pc(实际的机器)&----&虚拟机1(socks5服务器)&-----&另一个想通过socks5上网的虚拟机(2)
我在虚拟机2里的浏览器里设置了socks5代理,端口号为1080,并在浏览器里输入网址,如http://http://220.181.6.19/,百度首页
编译程序,运行:./socks5 1080
能够连接成功,但是
运行老是出现错误:recv username and password error
& &&&在int SelectMethod( int sock )函数中的
& && & // recv METHOD_SELECT_REQUEST
& & & & int ret = recv( sock, recv_buffer, BUFF_SIZE, 0 );
& & & & if( ret &= 0 )
& & & & & & & & perror( &recv error& );
& & & & & & & & close( sock );
& & & & & & & & return -1;
recv_buffer[0]=5, recv_buffer[0]=1, recv_buffer[0]=0;
但是当运行到函数int AuthPassword( int sock )时,sock为啥就收不到数据了
& & & & // auth username and password
& & & & int ret = recv( sock, recv_buffer, BUFF_SIZE, 0 );
& & & & if( ret &= 0 )
& & & & & & & & perror( &recv username and password error& );
& & & & & & & & close( sock );
& & & & & & & & return -1;
1.认证的时候的用户名和密码是怎么回事?是虚拟机2登陆时候的用户名和密码吗?
2.测试的时候是直接在虚拟机2的浏览器里输入网址就行吗?
3.我觉得int ForwardData( int sock, int real_server_sock )函数中,这个
& &&&if( FD_ISSET(sock, &fd_read) )
& && && &……
& &&&else if( FD_ISSET(real_server_sock, &fd_read) )
& && &&&……
第二个else if是不是应该是if啊,要不然的话从real_sever处接受的数据就传不到client了吧
非常感谢!
北京盛拓优讯信息技术有限公司. 版权所有 京ICP备号 北京市公安局海淀分局网监中心备案编号:22
广播电视节目制作经营许可证(京) 字第1234号
中国互联网协会会员&&联系我们:
感谢所有关心和支持过ChinaUnix的朋友们
转载本站内容请注明原作者名及出处

我要回帖

更多关于 系统不支持 mysql 的文章

 

随机推荐