【发布时间】:2012-01-13 13:51:35
【问题描述】:
我正在尝试在 Android 上为我的论文设置一个透明的 TCP 代理,但遇到了一些问题。我正在使用我在这个网站上找到的软件 - http://en.dfr.ch/free-software/java-tcp-proxy - 源代码是免费提供的。
我已经提取了源代码并从中创建了一个 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
这似乎可以重定向流量,但是当代理运行时,它似乎会不断创建新线程(连接),直到内存不足。使用日志记录,输出类似于下面。其中...表示上述输出日志在错误之前的几个循环。
正在运行的工作线程
新的传入连接
已创建服务器套接字和客户端套接字
创建的工作线程
定义的同行
BrowserSide-->611
正在运行的工作线程
...
/127.0.0.1:8080 /[any ip]:80:打开的文件太多
我真的很困惑为什么它不能正常工作。当我在计算机上的 Ubuntu 中尝试它时会出现相同的错误,但它在 Windows 中运行良好。我认为这可能是 iptables 的问题或 Linux 中一些基于 jvm/socket 的问题。我目前正在运行 iptables 版本 1.4.4。
提前感谢您抽出宝贵时间查看此问题。
【问题讨论】:
-
不要乱搞 SO_LINGER。这是毫无意义的,尤其是在 Java 中,因为如果关闭超时,您不会收到错误消息。
serverSocket对于已接受的套接字来说是一个糟糕的名称,尤其是当它从类名为ServerSocket的对象中接受时。
标签: java android linux proxy iptables