首页 > 解决方案 > C# SOCKS5 代理实现并不总是在本地计算机上工作

问题描述

语境

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

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

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

我的问题

我正在使用一个简单的 java 程序测试这个代理,该程序试图通过我的代理从网站获取状态代码。由于某种原因,在不修改任何代码的情况下,Java 程序大约有 10 次抛出 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 地址。

标签: c#proxyserversocks

解决方案


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


推荐阅读