代码之家  ›  专栏  ›  技术社区  ›  Lázár Zsolt

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

  •  1
  • Lázár Zsolt  · 技术社区  · 6 年前

    上下文

    我基于 RFC 1928 规范是我正在开发的软件的一部分。代理服务器将在我的软件中本地运行(即,它不在远程服务器上),并将用于重定向某些 HTTP / HTTPS 到特定IP地址的连接。

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

    我的软件就像一个发射器 .jar 文件。Java程序接受指定代理服务器的可选参数,并且我想利用这个特性来重定向任何一个代理服务器。 超文本传输协议 https协议 Java程序对我自己服务器的请求。这就是代理服务器必须与代理客户端(Java程序)在同一台计算机上运行的原因。

    我的问题

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

    我试过的

    如果我在一台单独的计算机上或在一台虚拟机上运行代理程序,它总是工作不出错(至少是希望的;我运行Java程序20次,它没有抛出异常)。在我的情况下,这不是一个可行的解决方案,因为代理必须在本地运行,作为我正在开发的程序的一部分。

    我的代码

    对于一个SO POST(~ 100行)来说,c*ySOCKS实现太长了,所以我把它上传到 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 回复  |  直到 6 年前
        1
  •  0
  •   Lázár Zsolt    6 年前

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