社区
网络编程
帖子详情
1000分!!怎样利用socks5代理从内部网络连接到外部网络?大家发表一下意见,有观点的马上给分。是大虾求求发个源码,很急的,只要能用,
casio
2002-03-04 01:39:39
怎样利用socks5代理从内部网络连接到外部网络?大家讨论一下。
有源嘛的求求发个源码(sew1@163.net)。
大虾这次一定要救我!公司很急的!感激!感激!:(
...全文
123
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)
网络
基础知识-
网络
传输协议
网络
基础知识-常见的
网络
传输协议 本博客参考了维基百科,整理
一下
作为我的复习纲要. 地址解析协议(ARP) 介绍:解析网路层地址来找寻数据链路层地址的一个在
网络
协议包中极其重要的
网络
传输协议. 功能:同一...
软考中级
网络
工程师学习笔记(知识点汇总)单点详细版
1、线路交换进行通信:是指在两个站之间有一个实际的物理连接,这种连接是结点之间线路的连接序列。 2、线路通信三种状态:线路建立、数据传送、线路拆除 3、线路交换缺点:典型的用户/主机数据连接状态,在大部
分
...
计算机
网络
(四)网际层
物理层也有叫转发器的,
网络
层中继系统用路由器,由于历史观音,很多书将路由器称为网关,也就是说它能拆出IP,
网络
层以上的叫网关。 地址解析协议ARP 网际控制报文协议ICMP 网际组管理协议ICMP IP地址编址方法...
2023年江苏省赛事
网络
空间安全理论题库
2023年江苏省赛事
网络
空间安全理论题库
网络
学习提要,真是太全了
第1章 交换技术第2章
网络
体系结构及协议第3章局域网技术第4章广域网技术第5章
网络
互连技术第6章
网络
操作系统第7章
网络
管理第8章
网络
安全与信息安全第9章 Internet第10章 企业网与Intranet第11章 TCP/IP联网第12章...
网络编程
18,356
社区成员
64,214
社区内容
发帖
与我相关
我的任务
网络编程
VC/MFC 网络编程
复制链接
扫一扫
分享
社区描述
VC/MFC 网络编程
c++
c语言
开发语言
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章