通过SOCKS代理发送UDP数据包

时间:2013-08-25 11:27:40

标签: c++ sockets proxy winsock socks

我正在构建一个简单的应用程序,它应该通过socks4 / 5代理发送UDP数据报包。我使用UDP方法,所以我不必保持连接打开。

然而,这并不像我想象的那么容易。根据这个模式,我得出结论,我不能通过代理发送UDP数据,而不首先与代理服务器建立TCP连接。 enter image description here

尽管如此,我找不到在CPP中构建此类连接的任何合适示例。我会感谢任何资源:)

2 个答案:

答案 0 :(得分:4)

有可能。您必须根据SOCKS5协议的wikipedia描述在客户端的连接请求的字段2中指定值0x03。

The client's connection request is
field 1: SOCKS version number, 1 byte (must be 0x05 for this version)
field 2: command code, 1 byte:
0x01 = establish a TCP/IP stream connection
0x02 = establish a TCP/IP port binding
0x03 = associate a UDP port
field 3: reserved, must be 0x00
field 4: address type, 1 byte:
0x01 = IPv4 address
0x03 = Domain name
0x04 = IPv6 address
field 5: destination address of
4 bytes for IPv4 address
1 byte of name length followed by the name for Domain name
16 bytes for IPv6 address
field 6: port number in a network byte order, 2 bytes

正如Hasturkun指出的那样

  

您的代码无效,因为您没有发送连接请求   一点都不您必须发送UDP ASSOCIATE请求(在TCP连接上),   并且您需要使用响应中的端口和地址来获取您的   数据报转发。

你应该看看Socks5 RFC

答案 1 :(得分:2)

Mike,您的代码不起作用,因为您尝试通过UDP数据报发送UDP关联命令。 SOCKS5握手必须通过TCP控制连接。

您的服务器可能需要为每个客户端保持一个开放的TCP连接,但每个客户端不需要打开许多TCP连接 - 一个TCP连接可以处理任意数量的UDP关联命令。

如果您的唯一目的是在服务器端根本不使用TCP,则无法达到您想要的效果。需要TCP连接,以便SOCKS代理知道何时取消UDP端口关联(即TCP连接断开时)。

但是,您的服务器应用程序根本不需要担心这一点。 TCP控制连接终止于SOCKS服务器,如图所示。

我建议阅读RFC。