通过SOCKS发送UDP数据包到互联网

来源:互联网 发布:效果器软件 编辑:程序博客网 时间:2024/05/16 00:32



一:连接代理服务器
C/C++ code

if (m_ProxySocket.Create())
if (!m_ProxySocket.Connect("192.168.0.5", 1080))
AddString(
"无法连接代理服务器!");
else
AddString(
"连接代理服务器成功。");
else
AddString(
"创建套节字失败!");



二:
C/C++ code

BYTE Order[]
= {5, 1, 0};
m_ProxySocket.Send(Order,
3);


应答:0x05   0x00   正确

三:
C/C++ code

BYTE Order[
10] = {5, 3, 0, 1}; //UDP ASSOCIATE
*(ULONG*) (Order + 4) = inet_addr("61.183.220.XX"); //IP最后一个断用XX代替,实际使用时为一合法IP
*(LPWORD) (Order + 4 + 4) = ntohs(8000);
m_ProxySocket.Send(Order,
4 + 4 + 2);


应答:05   00   00   01   C0   A8   00   05   0C   B1   即:192.168.0.5:3249   正确

四:发送UDP数据
C/C++ code

BYTE Order[
12] = {0, 0, 0, 1};
*(ULONG*) (Order + 4) = inet_addr("61.183.220.XX");
*(LPWORD) (Order + 4 + 4) = ntohs(8000);
Order[
10] = 0xFF; //我要发送的数据
Order[11] = 2; //我要发送的数据
m_ComSocket.SendTo(Order, 12, Port, IP); //Port为在第3步得到的端口:3249,IP为在第三步得到的IP:192.168.0.5
//m_ComSocket的创建方法为:m_ComSocket.Create(0, SOCK_DGRAM);



发完第4步后,m_ComSocket没有收到任何回应!注:不通过代理,直接发送0xFF   0x02到61.183.220.XX:8000是有回应的,可见要么数据没有到达61.183.220.XX:8000,要么数据丢失了。或者是我发的格式不正确,我想问题出在第四步,还请高手指点!谢谢。



---------------------------------------


既然你用udp,m_ComSocket怎么可能有反应呢,只要61.183.220.XX:8000能收到就ok了

楼主的假设是正确的,按理能收到回应。这种问题我没见到过。

 我自己解决了,问题在第三步:
C/C++ code

BYTE Order[
10] = {5, 3, 0, 1}; //UDP ASSOCIATE
*(ULONG*) (Order + 4) = inet_addr("61.183.220.XX"); //IP最后一个断用XX代替,实际使用时为一合法IP
*(LPWORD) (Order + 4 + 4) = ntohs(8000);
m_ProxySocket.Send(Order,
4 + 4 + 2);


改为:
C/C++ code

CString SocketAddress;
UINT SocketPort;
m_ComSocket.GetSockName(SocketAddress, SocketPort);
//这是用来接收远程服务器回应的,创建方法:m_ComSocket.Create(0, SOCK_DGRAM);

BYTE Order[
10] = {5, 3, 0, 1};
*(ULONG*) (Order + 4) = inet_addr(SocketAddress);
*(LPWORD) (Order + 4 + 4) = ntohs(SocketPort);
m_ProxySocket.Send(Order,
4 + 4 + 2);



其实任何地方不用修改,结果正是我想要的。