C# SOCKS5 代理实现并不总是在本地计算机上工作
C# SOCKS5 Proxy Implementation doesn't always work on local computer
上下文
我根据 RFC 1928 规范在 C# 中实现了 SOCKS 5 代理,作为我正在开发的软件的一部分。代理服务器将 运行 在我的软件本地(即它不在远程服务器上),它将用于将某些 HTTP
/ HTTPS
连接重定向到特定 IP 地址。
它应该如何工作/本地代理的原因
我的软件是一种启动器,可以启动 .jar
文件。 java 程序接受指定代理服务器的可选参数,我想利用此功能将 java 程序发出的任何 HTTP
或 HTTPS
请求重定向到我自己的服务器。这就是为什么代理服务器必须 运行 与代理客户端(java 程序)在同一台计算机上。
我的问题
我正在使用一个简单的 java 程序测试此代理,该程序试图通过我的代理从网站获取状态代码。出于某种原因,在不修改任何代码的情况下,java 程序大约有 10 次中有 8 次抛出 SocketException (java.net.SocketException: Reply from SOCKS server has bad length
),但在其他时候它可以正常工作并正确打印出 HTTP 响应代码。
我试过的
如果我 运行 代理程序在单独的计算机或虚拟机上,它总是可以正常工作(至少希望如此;我 运行 java 程序 ~ 20 次,它没有抛出异常)。在我的情况下,这不是一个可行的解决方案,因为作为我正在处理的程序的一部分,代理必须在本地 运行。
我的代码
C# SOCKS 实现对于 SO post(~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 上时可以工作,但在本地托管(和使用)时却失败了?当它在本地工作时,看似 运行dom 行为的原因可能是什么,我该如何解决?
编辑:
我忘了提及该代码目前仅用作 t运行sparent 代理,即它还没有中继与其他 IP 地址的连接。
我在休息 6 个月后重新访问了这个项目,我找到了解决这个问题的方法。在第 70-73 行,响应的前四个字节用 writer.Write(...)
分开发送。我通过用发送包含四个值的数组 (byte[4]
) 的单个 Write 调用替换这四行来解决了这个问题。
上下文
我根据 RFC 1928 规范在 C# 中实现了 SOCKS 5 代理,作为我正在开发的软件的一部分。代理服务器将 运行 在我的软件本地(即它不在远程服务器上),它将用于将某些 HTTP
/ HTTPS
连接重定向到特定 IP 地址。
它应该如何工作/本地代理的原因
我的软件是一种启动器,可以启动 .jar
文件。 java 程序接受指定代理服务器的可选参数,我想利用此功能将 java 程序发出的任何 HTTP
或 HTTPS
请求重定向到我自己的服务器。这就是为什么代理服务器必须 运行 与代理客户端(java 程序)在同一台计算机上。
我的问题
我正在使用一个简单的 java 程序测试此代理,该程序试图通过我的代理从网站获取状态代码。出于某种原因,在不修改任何代码的情况下,java 程序大约有 10 次中有 8 次抛出 SocketException (java.net.SocketException: Reply from SOCKS server has bad length
),但在其他时候它可以正常工作并正确打印出 HTTP 响应代码。
我试过的
如果我 运行 代理程序在单独的计算机或虚拟机上,它总是可以正常工作(至少希望如此;我 运行 java 程序 ~ 20 次,它没有抛出异常)。在我的情况下,这不是一个可行的解决方案,因为作为我正在处理的程序的一部分,代理必须在本地 运行。
我的代码
C# SOCKS 实现对于 SO post(~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 上时可以工作,但在本地托管(和使用)时却失败了?当它在本地工作时,看似 运行dom 行为的原因可能是什么,我该如何解决?
编辑:
我忘了提及该代码目前仅用作 t运行sparent 代理,即它还没有中继与其他 IP 地址的连接。
我在休息 6 个月后重新访问了这个项目,我找到了解决这个问题的方法。在第 70-73 行,响应的前四个字节用 writer.Write(...)
分开发送。我通过用发送包含四个值的数组 (byte[4]
) 的单个 Write 调用替换这四行来解决了这个问题。