社区
网络编程
帖子详情
1000分!!怎样利用socks5代理从内部网络连接到外部网络?大家发表一下意见,有观点的马上给分。是大虾求求发个源码,很急的,只要能用,
casio
2002-03-04 01:39:39
怎样利用socks5代理从内部网络连接到外部网络?大家讨论一下。
有源嘛的求求发个源码(sew1@163.net)。
大虾这次一定要救我!公司很急的!感激!感激!:(
...全文
163
58
打赏
收藏
1000分!!怎样利用socks5代理从内部网络连接到外部网络?大家发表一下意见,有观点的马上给分。是大虾求求发个源码,很急的,只要能用,
怎样利用socks5代理从内部网络连接到外部网络?大家讨论一下。 有源嘛的求求发个源码(sew1@163.net)。 大虾这次一定要救我!公司很急的!感激!感激!:(
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
58 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
cococut
2002-03-07
打赏
举报
回复
看来你的问题还没有解决,我去年做过一个类似oicq的东东,
有一个通讯类就是你现在需要的,sock5协议联接到外部,
如果需要给我发信,详细说明你现在要的是那部分!tcp和
udp的都有,这些东东第一次做的时候很难调,
my email:cococut@msn.com
alwzh
2002-03-07
打赏
举报
回复
我先问一下
RFC1928 在那儿可以找到
那位有代理服务器的原码给我发一份,我在这里先谢谢了
邮箱 alwzh_cn@sina.com
cococut
2002-03-07
打赏
举报
回复
以上是udp的过程,发送的时候的协议字按照我上面写的,比如
发送请求信息的时候,第四个字节到第八个自己都是0,不过所
有的一切都要在你的代理正确的情况下去调试,希望对你有所
帮助,如果有问题,咱们一起讨论!
cococut
2002-03-07
打赏
举报
回复
你的目的是要和服务器做UDP的数据传送。
步骤:
1,和代理建立tcp联接,(你已经完成)
2,向代理发送版本的请求信息,
我的实现:
void CCommunicator::SendVer ()
{
int datasize = 6;
char tempbuf[6];
tempbuf[0] = 5;
tempbuf[1] = 4;//标示后面所根的字接数
tempbuf[2] = 0;
tempbuf[3] = 1;
tempbuf[4] = 2;
tempbuf[5] = 3;
int senddatalen;
senddatalen = send(m_sock, (char *)tempbuf, 6, 0 );
}
这一步,你已经返回成功,是吗?
如果失败,断开建立的tcp联接,
如果成功,如果需要用户验证则进行步骤3,否则进行4,
3,如果需要用户验证,则
类似:
BOOL CCommunicator::SendUserTest()
{
int usernamelen=0;
int userpasslen=0;
usernamelen = m_strTestUserName.GetLength();
userpasslen = m_strTestUserPass.GetLength();
char tempbuf[100];
tempbuf[0] = 5;
tempbuf[1] = usernamelen;//标示后面所根的字接数
strcpy(&tempbuf[2],m_strTestUserName);
tempbuf[2+usernamelen] = userpasslen;
strcpy((char *)&tempbuf [3+usernamelen] ,m_strTestUserPass);
int senddatalen;
int len;
len = usernamelen +userpasslen + 3;
senddatalen = send(m_sock, (char *)tempbuf, len, 0 );
}
如果失败,断开建立的tcp联接,
如果用户返回成功,步骤4
4,发送请求的协议
类似:
void CCommunicator::SendRequestUDP ()
{
int const datasize = 10;
BYTE tempbuf[datasize];
tempbuf[0] = 5;
tempbuf[1] = 3;//标示UDP连接
tempbuf[2] = 0;
tempbuf[3] = 1;
tempbuf[4] = 0;
tempbuf[5] = 0;
tempbuf[6] = 0;
tempbuf[7] = 0;
*((SHORT*)(&(tempbuf[8]))) = m_uBindUDPPort;
//UDP在客户端绑定的端口,就是你本地机器的做udp数据传送的端口,调用
// socket函数后,再调用bind()来邦定一个端口。
char temp;
temp = tempbuf[8] ;
tempbuf[8] = tempbuf[9];
tempbuf[9] = temp;
int senddatalen = send(m_sock, (char *)tempbuf, datasize, 0 );
}
如果失败,断开建立的tcp联接,
如果返回成功,验证完毕!步骤5
5,真正的数据传送,用代理传送的时候,数据包的前面加上10个字节
类似:
void CCommunicator::CopyDataHead(BYTE * ptempbuf)
{
struct in_addr addr;
addr.s_addr = inet_addr(“202.220.33.333”);//这个ip是服务器端的ip
ptempbuf[0] = 0;
ptempbuf[1] = 0;
ptempbuf[2] = 0;
ptempbuf[3] = 1;
ptempbuf[4] = (char)addr.S_un.S_un_b.s_b1;;
ptempbuf[5] = (char)addr.S_un.S_un_b.s_b2;
ptempbuf[6] = (char)addr.S_un.S_un_b.s_b3;
ptempbuf[7] = (char)addr.S_un.S_un_b.s_b4;
*((SHORT*)(&(ptempbuf[8]))) = m_uServerUDPPort;//服务器的端口,就是你最终要发到那个服务器的端口,也就是你的qq服务器。
char temp;
temp = ptempbuf[8] ;
ptempbuf[8] = ptempbuf[9];
ptempbuf[9] = temp;
}
真正发送的时候类似:
int CCommunicator::SendBufferUDP(LPBYTE lpBuf,int nLen)
{
BYTE tempbuf[1000];
int iHeadData = 0;
struct sockaddr_in her;
her.sin_family = AF_INET;
her.sin_addr.s_addr = inet_addr(m_szProxyAddr);//代理服务器
her.sin_port = htons(m_uSocksPort);//发送请求的时候返回的代理服务器端的端口,记住,这是最重要的。
CopyDataHead(tempbuf);
iHeadData = 10;
nLen=nLen + 10;
int addr_len;
addr_len = sizeof(struct sockaddr);
CopyMemory((char *)&tempbuf[iHeadData],lpBuf,nLen);
int returndatalen = sendto(m_socket,(char *)tempbuf,nLen,0,(struct sockaddr *)&her,addr_len);
}
大致的过程就是上面!
grief95
2002-03-07
打赏
举报
回复
c -> proxy 的连接过程使用socks5协议,只是一个组包协议,很简单。连接后,proxy会连接到 app server,对于用户程序来说那是透明的。
socks5协议比socks4协议升级的地方主要是支持udp协议,具体怎么用我也不清楚,建议看一下rfc
grief95
2002-03-07
打赏
举报
回复
c -> proxy 的连接过程使用socks5协议,只是一个组包协议,很简单。连接后,proxy会连接到 app server,对于用户程序来说那是透明的。
socks5协议比socks4协议升级的地方主要是支持udp协议,具体怎么用我也不清楚,建议看一下rfc
sweet
2002-03-06
打赏
举报
回复
upp
gqxs
2002-03-06
打赏
举报
回复
关注
jobs2001
2002-03-06
打赏
举报
回复
看看
http://www.csdn.net/expert/topic/470/470959.xml
shenleav
2002-03-06
打赏
举报
回复
不好意思,借贵宝地说点事情...这几天我发的贴子不知道为什么点击后总是提示:"找不到该页"...我看到有些网友的贴子也有这个问题...但是有的就没问题...
例如我的贴子 "怎样得到打印机的DC" 还有"我的.."(是一个测试)...等贴子都是这样....大家可以搜索一下这两个贴子....还有好几个我的贴子都是这样...气死我了...大家知道是怎么回事么?
casio
2002-03-06
打赏
举报
回复
请看这一段代码,错在那里?我这里不需要密码验证的
bool CIUDPDataDlg::m_connect(char * server_ip, short server_port, char * dest_ip, short dest_port)
{
///////////////////////////////////////
int s_tcp;
struct sockaddr_in srv_addr;
struct socks_v_connect_message_t cnt_msg;
struct socks_v_connect_return_t cnt_rtn;
struct socks_v_requests_cmd_t req_cmd;
struct socks_v_reply_cmd_t cmd_rpy;
////////////////////////以下配置相关参数,初始化srv_addr
memset(& srv_addr,0,sizeof(srv_addr));
srv_addr.sin_family = PF_INET;
srv_addr.sin_addr.s_addr = inet_addr(server_ip);
srv_addr.sin_port = htons(server_port);
/////////////////////////以下与socks服务器建立连接
s_tcp = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if( -1 == connect(s_tcp,(struct sockaddr*)&srv_addr,sizeof(srv_addr)))
{
AfxMessageBox("连接 socks 服务器失败,请检查相关参数配置.");
closesocket(s_tcp);
return 0;
}
//////////////////////////发送请求
memset(& cnt_msg,0,sizeof(cnt_msg));
cnt_msg.version = 0x05;
cnt_msg.nmethods= 0x01;
cnt_msg.methods[0] = 0x00;
///////////////////////////////////
char buf[100];
// 让PROXY选择认证方法
buf[0] = 0x05;
buf[1] = 0x01;
buf[2] = 0x00; // 无需认证
send(s_tcp,(const far char*)buf,3,0);
recv(s_tcp,buf,10,0);
if(buf[1] != 0x00)
AfxMessageBox("proxy 服务器需要验证用户身份!");
return 0;
/////////请求连接
if(send(s_tcp,(const char*)& cnt_msg,sizeof(cnt_msg),0) <= 0)
{
AfxMessageBox("proxy服务器接收数据失败.");
closesocket(s_tcp);
return 0;
}
/////////返回数据
if(recv(s_tcp,(char *)& cnt_rtn,sizeof(cnt_rtn),0)<=0)
{
AfxMessageBox("proxy服务器返回数据失败.");
closesocket(s_tcp);
return 0;
}
////////////////////////////////////////////以下为与目的主机建立连接
req_cmd.version = 0x05;
req_cmd.command = 0x01;
req_cmd.atvp = 0x01;
*((int *)req_cmd.dst_addr) = inet_addr(dest_ip);
req_cmd.dst_port = htons(dest_port);
///////////////////////请求连接
if(send(s_tcp,(const char *)& req_cmd,sizeof(req_cmd),0) <=0)
{
AfxMessageBox("命令发送失败.");
closesocket(s_tcp);
return 0;
}
///////////////////////返回数据
if(recv(s_tcp,(char *)& cmd_rpy,sizeof(cmd_rpy),0)<=0)
{
AfxMessageBox("接收命令失败.");
return 0;
}
}
没什么这段代码每次返回失败字样?麻烦帮我看一下,谢谢!
casio
2002-03-06
打赏
举报
回复
请看这一段代码,错在那里?我这里不需要密码验证的
bool CIUDPDataDlg::m_connect(char * server_ip, short server_port, char * dest_ip, short dest_port)
{
///////////////////////////////////////
int s_tcp;
struct sockaddr_in srv_addr;
struct socks_v_connect_message_t cnt_msg;
struct socks_v_connect_return_t cnt_rtn;
struct socks_v_requests_cmd_t req_cmd;
struct socks_v_reply_cmd_t cmd_rpy;
////////////////////////以下配置相关参数,初始化srv_addr
memset(& srv_addr,0,sizeof(srv_addr));
srv_addr.sin_family = PF_INET;
srv_addr.sin_addr.s_addr = inet_addr(server_ip);
srv_addr.sin_port = htons(server_port);
/////////////////////////以下与socks服务器建立连接
s_tcp = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if( -1 == connect(s_tcp,(struct sockaddr*)&srv_addr,sizeof(srv_addr)))
{
AfxMessageBox("连接 socks 服务器失败,请检查相关参数配置.");
closesocket(s_tcp);
return 0;
}
//////////////////////////发送请求
memset(& cnt_msg,0,sizeof(cnt_msg));
cnt_msg.version = 0x05;
cnt_msg.nmethods= 0x01;
cnt_msg.methods[0] = 0x00;
///////////////////////////////////
char buf[100];
// 让PROXY选择认证方法
buf[0] = 0x05;
buf[1] = 0x01;
buf[2] = 0x00; // 无需认证
send(s_tcp,(const far char*)buf,3,0);
recv(s_tcp,buf,10,0);
if(buf[1] != 0x00)
AfxMessageBox("proxy 服务器需要验证用户身份!");
return 0;
/////////请求连接
if(send(s_tcp,(const char*)& cnt_msg,sizeof(cnt_msg),0) <= 0)
{
AfxMessageBox("proxy服务器接收数据失败.");
closesocket(s_tcp);
return 0;
}
/////////返回数据
if(recv(s_tcp,(char *)& cnt_rtn,sizeof(cnt_rtn),0)<=0)
{
AfxMessageBox("proxy服务器返回数据失败.");
closesocket(s_tcp);
return 0;
}
////////////////////////////////////////////以下为与目的主机建立连接
req_cmd.version = 0x05;
req_cmd.command = 0x01;
req_cmd.atvp = 0x01;
*((int *)req_cmd.dst_addr) = inet_addr(dest_ip);
req_cmd.dst_port = htons(dest_port);
///////////////////////请求连接
if(send(s_tcp,(const char *)& req_cmd,sizeof(req_cmd),0) <=0)
{
AfxMessageBox("命令发送失败.");
closesocket(s_tcp);
return 0;
}
///////////////////////返回数据
if(recv(s_tcp,(char *)& cmd_rpy,sizeof(cmd_rpy),0)<=0)
{
AfxMessageBox("接收命令失败.");
return 0;
}
}
没什么这段代码每次返回失败字样?麻烦帮我看一下,谢谢!
HardWorking
2002-03-06
打赏
举报
回复
好像不用考虑内部、外部,你只要用socket API或封装的类就行了。socket可通过ip address 通信。找本网络编程方面的书参考一下吧
makefile
2002-03-06
打赏
举报
回复
我自己写了一个,支持TCP,UDP和基于明码的认证,使用的是C++
在linux上用,现在我在公司里通过他走msn和oicq好像没什么致命bug
除此,本人还有telnet ftp和email的代理,都是没事的时候写的。
想要就email me,这个论坛很慢,我不常来的。
0313700000
2002-03-05
打赏
举报
回复
SC
moony_blue
2002-03-05
打赏
举报
回复
http://feeyoo.51.net/devdoc/docs/netdev/proxycode.htm
里边有最最精简的穿透sock4,sock5,http代理的源码,
如果你要我写的支持代理穿透的模块的源码,我可以发给你。
casio
2002-03-05
打赏
举报
回复
moony_blue(发呆的深蓝):
发到sew1@163.net
记得要是完成的能编译的源代码。多谢你了!能用的话我会再贴空贴子送分。拜托。。。。。。
Hover
2002-03-05
打赏
举报
回复
到此一游...
shenleav
2002-03-05
打赏
举报
回复
up
jean777
2002-03-05
打赏
举报
回复
qeqwe
加载更多回复(38)
SOCKS5
通过以上方式配置的
代理
服务器的极限连接数是15万,如果需要50-100万并发连接数的S5
代理
需求请联系博主,新方式采用docker技术实现,在16G内存的配置上能达到单台70万并发,需要配置低,更高
代理
并发连接数(35w+)及对
代理
稳定性要求非常高等特殊需求的话,请私信给我即可。至此,一台高性能多IP的Sockt5
代理
服务器已配置完毕,如果想要不同IP地址绑定不同端口,请自行修改配置脚本即可,另外,请自行将各个配置脚本加入到启动脚本里面,实现重启后也能保持状态!...
SOCKS5
批量检测工具,多线程的,速度很快。
SOCKS5
批量检测工具, 多线程的, 速度很快。 可以批量检测
SOCKS5
是否可达, 并在软件上显示, 或者保存在文本文件里。 原理, 采用多线程来检测, 使用临界处理。 部
分
核心代码如下: function IsIPAddress(ss: string): Boolean; var s, s1: string; ii, p: integer; begin s1 := ss; ...
Ubuntu18.04搭建
socks5
服务
本文将介绍如何在 Linux 系统上使用 Dante 搭建一个
SOCKS5
代理
服务器,仅供学习!
腾讯云搭建
Socks5
一系列及相关内容
腾讯云搭建
Socks5
多IP
代理
服务器实现游戏单窗口单IP 腾讯云多IP
Socks5
搭建教程 配合
代理
工具实现 单窗口单IP 1.多IP服务器选择 2.服务器购买 3.创建弹性网卡,绑定弹性公网IP 实现多IP 4.如何更换IP 5.服务器网卡绑定内网IP 6.使用CCProxy 搭建
socks5
服务器 7.
socks5
IP如何使用 实现 端游 模拟器 手机 单窗口单IP 7.1 万安挂机宝 下载后安装包里有介绍. 7.2.proxydroid 使用说明 以雷电模
关于
SOCKS5
通信的客户端问题
我的编译环境是win10+visual studio 2015 客户端是用C#写的控制台程序 我调试的时候是在本机上架设了一个
代理
服务器,所以
代理
端地址是127.0.0.1:1002 先上代码 /* *********************************************** * Author : CYhyq * Email : 42...
网络编程
18,357
社区成员
64,165
社区内容
发帖
与我相关
我的任务
网络编程
VC/MFC 网络编程
复制链接
扫一扫
分享
社区描述
VC/MFC 网络编程
c++
c语言
开发语言
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章