我正在为我的论文尝试在Android上搭建一个透明的TCP代理,但是遇到了一些问题。我使用了在这个网站上找到的软件 - http://en.dfr.ch/free-software/java-tcp-proxy - 其源代码是免费提供的。
我已经提取了源代码,并创建了一个Android应用程序。主要的代码块在下面的循环中。
这似乎可以重定向流量,然而当代理在运行时,它似乎会不断地创建新线程(连接),直到内存耗尽。通过日志,输出与下面类似。其中“...”表示错误之前的多个循环。
引用: - 工作线程正在运行 - 新连接到来 - 创建服务器套接字和客户端套接字 - 创建工作线程 - 定义对等体 - 浏览器端 - > 611 - 工作线程正在运行 - ... - /127.0.0.1:8080 <-> /[any ip]:80:Too many open files
我真的很困惑为什么它不能正常工作。当我在计算机上的Ubuntu上尝试时,出现了相同的错误,但在Windows上完美地工作。我认为这可能是Linux中iptables或某些基于jvm/socket的问题。我目前运行的是iptables版本1.4.4。
感谢您花时间查看这个问题。
我已经提取了源代码,并创建了一个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规则:
iptables -t nat -A OUTPUT -p tcp --dport 80 -d [any ip] -j REDIRECT --to-port 8080
这似乎可以重定向流量,然而当代理在运行时,它似乎会不断地创建新线程(连接),直到内存耗尽。通过日志,输出与下面类似。其中“...”表示错误之前的多个循环。
引用: - 工作线程正在运行 - 新连接到来 - 创建服务器套接字和客户端套接字 - 创建工作线程 - 定义对等体 - 浏览器端 - > 611 - 工作线程正在运行 - ... - /127.0.0.1:8080 <-> /[any ip]:80:Too many open files
我真的很困惑为什么它不能正常工作。当我在计算机上的Ubuntu上尝试时,出现了相同的错误,但在Windows上完美地工作。我认为这可能是Linux中iptables或某些基于jvm/socket的问题。我目前运行的是iptables版本1.4.4。
感谢您花时间查看这个问题。
serverSocket
是一个可接受的套接字的糟糕名称,特别是当它从一个类名为ServerSocket
的对象中被接受时。 - user207421