2

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

然而这并不像我想象的那么容易。根据这个模式,我得出结论,如果不先与代理服务器建立 TCP 连接,我就无法通过代理发送 UDP 数据。 在此处输入图像描述

尽管如此,我还是找不到在 CPP 中建立这种联系的任何合适的例子。我会感谢任何资源:)

4

2 回答 2

4

有可能的。您必须根据SOCKS5 协议的维基百科描述在客户端连接请求的字段 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

正如哈斯图尔昆所指出的

您的代码不起作用,因为您根本没有发送连接请求。您必须发送一个 UDP ASSOCIATE 请求(在 TCP 连接上),并且您需要使用响应中的端口和地址来中继您的数据报。

你真的应该看看Socks5 RFC

于 2013-08-25T11:47:42.940 回答
2

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

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

如果您的唯一目的是在服务器端根本不使用 TCP,那么它将无法实现您想要的。需要 TCP 连接,以便 SOCKS 代理知道何时解除 UDP 端口的关联(即,当 TCP 连接断开时)。

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

我建议阅读 RFC。

于 2013-09-13T21:09:55.977 回答