SOCKS5协议UDP请求C++实现相关技术问题咨询
SOCKS5 UDP功能实现问题解答
问题1:发送和接收数据时是否都需要使用UDP request header?
是,双向传输都需要携带符合RFC1928规范的UDP请求头:
- 客户端向SOCKS5服务器发送待转发的UDP包时,必须在业务载荷前添加UDP请求头,头中填入远端目标服务的地址、端口等信息,服务器才能识别转发目标。
- SOCKS5服务器向客户端回传远端返回的UDP包时,同样会在业务载荷前添加UDP请求头,头中填入该数据包的源端(即远端服务)的地址、端口信息,供客户端识别数据包来源。
注:仅UDP中继链路的数据包需要加该头,SOCKS5代理协商阶段的TCP交互报文不需要添加。
问题2:能否使用winsock2中的WSASendTo接口实现数据包通过SOCKS5服务器的转发?
可以,按以下流程处理即可:
- 首先完成SOCKS5代理的UDP关联流程:通过TCP链路连接SOCKS5服务器完成认证、发送UDP ASSOCIATE请求,获取服务器返回的UDP中继端口与地址,所有待转发的UDP包都需要发往该中继地址,而非直接发往远端目标。
- 调用
WSASendTo前,手动在业务载荷前拼接符合规范的SOCKS5 UDP请求头,填入远端目标的地址、端口参数,将拼接后的完整数据包作为发送缓冲区,WSASendTo的目标地址参数填SOCKS5服务器的UDP中继地址即可。 - 接收返回数据时,调用
WSARecvFrom拿到服务器返回的数据包后,先剥除开头的SOCKS5 UDP请求头,剩余内容即为远端服务返回的实际业务数据。
注:普通的
sendto/recvfrom接口也可实现该逻辑,WSASendTo不存在功能限制,可正常使用。
内容的提问来源于stack exchange,提问作者Olli
相关产品推荐
相关产品推荐

