C#SOCKS5代理实现并非总是在本地计算机上运行

时间:2018-06-24 19:26:07

标签: c# proxy server socks

上下文

作为正在开发的软件的一部分,我根据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次,并且没有引发异常)。就我而言,这不是可行的解决方案,因为代理必须作为我正在开发的程序的一部分在本地运行。

我的代码

对于SO帖子(约100行),C#SOCKS实现太长,因此我已将其上传到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地址。

1 个答案:

答案 0 :(得分:0)

六个月的休息后,我刚刚重新访问了这个项目,并且找到了解决该问题的方法。在第70-73行,响应的前四个字节分别与writer.Write(...)发送。我用一个写入调用替换了这四行,从而发送了包含四个值的数组(byte[4])。