用 Qt 通过 SOCKS5 打开 TCP 流
在连接到目标之前为 QTcpSocket 设置显式代理,使用 Qt Network 而无需 GUI。
Qt Network 可以直接为一个 TCP 套接字协商 SOCKS5。在已有的 Qt 应用程序中,在连接之前配置该套接字:
QNetworkProxy proxy(
QNetworkProxy::Socks5Proxy,
"proxy.example.net",
1080
);
socket.setProxy(proxy);
socket.connectToHost("service.example.net", 12345);
socket 是一个已有的 QTcpSocket。示例中的目标地址和端口代表应用程序的 TCP 服务。Qt 会先到达代理,然后请求代理连接到该目标。对于可公开访问、且允许使用公共中转的 TCP 服务,SOCKS5 代理列表为这个不使用代理账号的示例提供候选。请确认候选允许该服务实际使用的主机和端口。
常规的异步套接字信号依然适用:在交换应用数据之前等待 connected(),并处理 errorOccurred()。在连接使用期间保持套接字对象存活。对于阻塞式代码,则应改用 Qt 有文档记载的等待方法,并显式设定超时。
这需要 Qt Network,而不是基于控件的 GUI。这个显式设置只属于本套接字。其他套接字可以保留应用程序的默认值,或者选择另一个代理。要让这个套接字直连,请在连接之前把它的代理类型设为 QNetworkProxy::NoProxy。