c# - C# SOCKS5 代理实现并不总是在本地计算机上工作
问题描述
语境
作为我正在开发的软件的一部分,我根据RFC 1928规范在 C# 中制作了 SOCKS 5 代理实现。代理服务器将在我的软件中本地运行(即它不在远程服务器上),它将用于将某些HTTP
/HTTPS
连接重定向到特定的 IP 地址。
它应该如何工作/本地代理的原因
我的软件有点像启动.jar
文件的启动器。java 程序接受指定代理服务器的可选参数,我想利用此功能将 java 程序发出的任何请求HTTP
或HTTPS
请求重定向到我自己的服务器。这就是代理服务器必须与代理客户端(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 地址。
解决方案
我刚刚在休息 6 个月后重新审视了这个项目,我已经找到了解决这个问题的方法。在第 70-73 行,响应的前四个字节分别用writer.Write(...)
. byte[4]
我通过用一个发送包含四个值的数组 ( ) 的单个 Write 调用替换这四行来解决了这个问题。
推荐阅读
- java - Java 14 使用什么 JRE?
- validation - 如何仅验证 Vee-validate 3.x 中的某些字段?
- c# - 如何在 DataGridView 中突出显示搜索阿拉伯语文本?
- javascript - 代码适用于桌面和 Android,但不适用于 Apple
- android - 当我用 .a 文件构建 ndk 时,它会像这样“添加符号时出错:文件格式错误”
- google-apps-script - 如何调试 Google 表格扩展插件:没有出现设置选项
- c# - 无法通过绑定以编程方式设置 TextBox 的文本
- javascript - 第一行 ID 值适用于 JSON 对象中的所有行 ID
- batch-file - 来自 wmic 的批处理文件集变量
- c - 将一个字符串复制到另一个字符串,直到 C 中的某个字符