我想爲我的論文在Android上設置一個透明的TCP代理,但我遇到了一些問題。我正在使用我在本網站上找到的軟件 - http://en.dfr.ch/free-software/java-tcp-proxy - 源代碼可以免費使用。在Android/Linux上設置透明TCP代理時遇到問題
我已經提取了源代碼並從中創建了一個Android應用程序。代碼的主要部分在下面的循環中。
while(!interrupted()) {
Socket serverSocket=srvSock.accept();
Log.e(TAG, "New incoming connection");
try {
serverSocket.setSoLinger(true,lingerTime);
Socket clientSocket=new Socket(dstAddr,dstPort);
clientSocket.setSoLinger(true,lingerTime);
Log.e(TAG, "Server socket and client socket created");
StreamCopyThread sToC=new StreamCopyThread(serverSocket,clientSocket, "BrowserSide");
StreamCopyThread cToS=new StreamCopyThread(clientSocket,serverSocket, "ServerSide");
Log.e(TAG, "Working threads created");
sToC.setPeer(cToS);
cToS.setPeer(sToC);
Log.e(TAG, "Peers defined");
synchronized(lock) {
connections.addElement(cToS);
connections.addElement(sToC);
sToC.start();
cToS.start();
Log.e(TAG, "Working threads running");
}
} catch(Exception xc) {
Log.e(TAG, header+":"+xc.getMessage());
// xc.printStackTrace();
}
}
srvSock.close();
流量從IP重定向到代理處理它的本地主機。要做到重定向,我已經使用了下面的防火牆規則:
iptables -t nat -A OUTPUT -p tcp --dport 80 -d [any ip] -j REDIRECT --to-port 8080
這似乎在重定向交通工作,但代理運行時,它似乎直到用完,不斷創造新的線程(連接)的記憶。通過日誌記錄,輸出與下面類似。其中......代表錯誤之前的上述輸出日誌的多個循環。
工作線程運行
新傳入的連接
服務器套接字和客戶端套接字創建
工作線程創建
同行定義
BrowserSide - > 611
個運行
工作線程...
/127.0.0.1:8080 < - >/[任何IP]:80:打開的文件太多
我,爲什麼真糊塗它工作不正常。當我在計算機上的Ubuntu中嘗試它時出現相同的錯誤,但在Windows中它工作得很好。我想這可能是iptables或Linux中的一些基於jvm/socket的問題。我目前正在運行iptables版本1.4.4。
非常感謝您花時間看看這個問題。
周圍不要惹SO_LINGER。這是毫無意義的,特別是在Java中,因爲如果關閉超時,您不會收到錯誤。 'serverSocket'對於一個接受的套接字來說是一個糟糕的名字,尤其是當它從一個類名爲ServerSocket的對象接受時。 – EJP