C# SOCKS5 代理实现并不总是在本地计算机上工作



>上下文

我基于 RFC 1928 规范在 C# 中制作了一个 SOCKS 5 代理实现,作为我正在开发的软件的一部分。代理服务器将在我的软件中本地运行(即它不在远程服务器上(,它将用于将某些HTTP/HTTPS连接重定向到特定的IP地址。

它应该如何工作/本地代理的原因

我的软件有点像启动.jar文件的启动器。java 程序接受指定代理服务器的可选参数,我想利用此功能将 java 程序发出的任何HTTPHTTPS请求重定向到我自己的服务器。这就是为什么代理服务器必须与代理客户端(java程序(在同一台计算机上运行的原因。

我的问题

我正在使用一个简单的 java 程序测试此代理,该程序尝试通过我的代理从网站获取状态代码。出于某种原因,在不修改任何代码的情况下,Java 程序大约 10 次中有 8 次抛出 SocketException (java.net.SocketException: Reply from SOCKS server has bad length(,但在其他时候它可以工作并正确打印出 HTTP 响应代码。

我尝试过什么

如果我在单独的计算机或虚拟机上运行代理程序,它始终可以正常工作而不会出现任何错误(至少希望如此;我运行了 java 程序 ~20 次,它没有抛出异常(。就我而言,这不是一个可行的解决方案,因为代理必须在本地运行,作为我正在处理的程序的一部分。

我的代码

C# SOCKS 实现对于 SO 帖子来说太长了(~100 行(,所以我已将其上传到 Pastebin。

以下是我的 java 测试代码。

public static void main(String[] args) throws Exception {
Proxy proxy = new Proxy(Proxy.Type.SOCKS, new InetSocketAddress("127.0.0.1", 32128));
HttpURLConnection conn = (HttpURLConnection)(new URL("http://somedomain.com/")
.openConnection(proxy));
conn.setDoInput(true);
conn.setDoOutput(false);
conn.connect();
System.out.println(conn.getResponseCode());
}

问题

如果我在单独的计算机/VM 上托管代理服务器,为什么代理服务器可以工作,但在本地托管(和使用(时会失败?当它在本地工作时,看似随机行为的原因可能是什么,我该如何解决它?

编辑:

我忘了提到该代码目前仅用作透明代理,即它尚未中继到其他 IP 地址的连接。

我刚刚在休息 6 个月后重新审视了这个项目,我找到了这个问题的解决方案。在第 70-73 行,响应的前四个字节与writer.Write(...)一起单独发送。我通过将这四行替换为单个 Write 调用来解决这个问题,该调用发送一个包含四个值的数组 (byte[4](。

相关内容

最新更新