通过socks5代理来建立发送tcp消息没有任何问题,但是udp就不行了,请问为什么
我的思路是:
根据rfc1928与代理服务器建立连接的方式基本上与tcp一样就是把第二次发送时候的
把CMD设置为3,也就是UDP ASSOCIATE X'03',
接着的区别是,
如果tcp,直接用建立的socket 调用send recv就可以了
如果是发送udp消息,就以这样的格式发送
+----+------+------+----------+----------+----------+
|RSV | FRAG | ATYP | DST.ADDR | DST.PORT | DATA |
+----+------+------+----------+----------+----------+
| 2 | 1 | 1 | Variable | 2 | Variable |
+----+------+------+----------+----------+----------+
我做了个很简单的试验
char udpData[100];memset(&udpData,0,100);
udpData[0]=0;//RSV
udpData[1]=0;//FRAG
udpData[3]=1;//表示ipv4
len=4;
lip=inet_addr("192.168.1.70");//目的机的ip
memcpy(&udpData[len],&lip,4);
len+=4;
uport=htons(2004);//目的机的端口
memcpy(&udpData[len],&uport,2);
len+=2;
memcpy(&udpData[len],"hello",5);//发送一个字符串
len+=5;
s.Send(&udpData,len);//发送出去了,但是另外的udp接受端没反映
我的思路是:
根据rfc1928与代理服务器建立连接的方式基本上与tcp一样就是把第二次发送时候的
把CMD设置为3,也就是UDP ASSOCIATE X'03',
接着的区别是,
如果tcp,直接用建立的socket 调用send recv就可以了
如果是发送udp消息,就以这样的格式发送
+----+------+------+----------+----------+----------+
|RSV | FRAG | ATYP | DST.ADDR | DST.PORT | DATA |
+----+------+------+----------+----------+----------+
| 2 | 1 | 1 | Variable | 2 | Variable |
+----+------+------+----------+----------+----------+
我做了个很简单的试验
char udpData[100];memset(&udpData,0,100);
udpData[0]=0;//RSV
udpData[1]=0;//FRAG
udpData[3]=1;//表示ipv4
len=4;
lip=inet_addr("192.168.1.70");//目的机的ip
memcpy(&udpData[len],&lip,4);
len+=4;
uport=htons(2004);//目的机的端口
memcpy(&udpData[len],&uport,2);
len+=2;
memcpy(&udpData[len],"hello",5);//发送一个字符串
len+=5;
s.Send(&udpData,len);//发送出去了,但是另外的udp接受端没反映
char udpData[100];memset(&udpData,0,100);
udpData[0]=0;
udpData[1]=0;
udpData[2]=0;
udpData[3]=1;
len=4;
lip=inet_addr("192.168.1.70");
memcpy(&udpData[len],&lip,4);
len+=4;
uport=/*htons(2004);*/htons(2004);
memcpy(&udpData[len],&uport,2);
len+=2;
memcpy(&udpData[len],"hello",5);
len+=5;
s.Send(&udpData,len);
192.168.1.70是我的机器ip地址8888是我的机器上的wingate开的sock5端口,2004是负责接受udp消息的端口,如果我不通过代理,直接发送udp是可以接受到消息的比如
CSocket sc;
sc.Create(2005,SOCK_DGRAM);
sc.SendTo("hello",5,2004,"192.168.1.70");
下面的代码是通过代理发消息,就不行了,请教各位,谢谢了
BOOL TryUDPProxy()
{
CSocket s;
if(!s.Create())
return FALSE;
if(!s.Connect("192.168.1.70",8888))
return FALSE;
char command[10];
memset(command,0,10);
command[0]=5;
command[1]=1; //Number of logon types
command[2]=0; //2=user/pass, 0=no logon
int len=false?4:3; //length of request int read=s.Send(command,len);
if(read<=0)
return FALSE;
char rcvData[2];
memset(rcvData,0,2);
read=s.Receive(rcvData,2); if(rcvData[0] != 5 || (rcvData[1]!=0 && rcvData[1]!=2))
{
AfxMessageBox(_T("通过代理连接主站不成功!"));
s.Close();
return FALSE;
}
char *pcommand=new char[10+strlen("192.168.1.70")+1];
memset(pcommand,0,10+strlen("192.168.1.70")+1);
pcommand[0]=5;
pcommand[1]=3;
pcommand[2]=0;
pcommand[3]=1;
len=4;
ULONG lip=inet_addr("192.168.1.70");
memcpy(&pcommand[len],&lip,4);
len+=4;
USHORT uport=htons(2004);
memcpy(&pcommand[len],&uport,2);
len+=2;
read=s.Send(pcommand,len);
if(read<=0)
return FALSE;
delete pcommand;
char rcvchar[100];memset(rcvchar,0,100);
read=s.Receive(rcvchar,100);
if(read<=0)
return FALSE;
if (rcvchar[1]!=0 || rcvchar[0]!=5)
{
AfxMessageBox(_T("通过代理连接主站不成功!"));
s.Close();
return FALSE;
}
//////////////////////////////
UINT ir;memcpy(&ir,&rcvchar[4],4); sockaddr_in acptsi;acptsi.sin_addr.s_addr=(u_long)ir;
AfxMessageBox(inet_ntoa(acptsi.sin_addr));
u_short uports;memcpy(&uports,&rcvchar[8],2);uports=htons(uports); char udpData[100];memset(&udpData,0,100);
udpData[0]=0;
udpData[1]=0;
udpData[2]=0;
udpData[3]=1;
len=4;
lip=inet_addr("192.168.1.70");
memcpy(&udpData[len],&lip,4);
len+=4;
uport=/*htons(2004);*/htons(2004);
memcpy(&udpData[len],&uport,2);
len+=2;
memcpy(&udpData[len],"hello",5);
len+=5;
read=s.Send(&udpData,len);
return TRUE;
}