簡體   English   中英

C#SOCKS5代理實現並非始終在本地計算機上運行

[英]C# SOCKS5 Proxy Implementation doesn't always work on local computer

語境

作為我正在開發的軟件的一部分,我根據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地址。

經過6個月的休息,我剛剛重新訪問了該項目,並且找到了解決該問題的方法。 在第70-73行,響應的前四個字節與writer.Write(...)分開發送。 我通過用發送一個包含四個值的數組( byte[4] )的單個Write調用替換了這四行來解決了這個問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM