1000分!!怎样利用socks5代理从内部网络连接到外部网络?大家发表一下意见,有观点的马上给分。是大虾求求发个源码,很急的,只要能用,

casio 2002-03-04 01:39:39
怎样利用socks5代理从内部网络连接到外部网络?大家讨论一下。
有源嘛的求求发个源码(sew1@163.net)。
大虾这次一定要救我!公司很急的!感激!感激!:(
...全文
123 58 打赏 收藏 转发到动态 举报
写回复
用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)

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧