[英]Java Socket Packet Interception
我正在嘗試用 Java 編寫一個攔截數據/數據包的套接字程序。
我已經成功地用python寫了這個:
import socket
def createListener(port):
srvSock = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP)
srvSock.bind(('localhost', port))
srvSock.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)
while True:
raw_data, addr = srvSock.recvfrom(65536)
print('data: ' , raw_data)
createListener(80)
這是我的基本 Java 套接字程序
public static void main(String[] args) {
try{
ServerSocket ss = new ServerSocket(80);
Socket s = ss.accept();
DataInputStream dis = new DataInputStream(s.getInputStream());
String str = (String)dis.readUTF();
System.out.println("data: "+str);
ss.close();
} catch(IOException i){
System.out.println(i);
}
}
但是,在運行時,它不會像 python 程序那樣攔截通過網絡端口移動的所有數據。 具體來說,Python 腳本中的這一行srvSock.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)
使套接字能夠偵聽端口並捕獲/攔截通過它的全部數據。
對於這個問題,我根本找不到這種語法的 Java 替代方案或任何解決我的問題的方法。 對於如何使用套接字攔截網絡端口上的數據包,我將不勝感激。
謝謝
我相當確定您嘗試做的事情不能用 Java 完成。 看起來您正在嘗試使用“混雜模式”,但 Java 套接字無法以混雜模式啟動。 Java 套接字是一種端到端的實現:它們不能在網絡端口上偵聽所有流量。 當然,網絡端口必須處於混雜模式,但我認為 Java 不是您的正確選擇。
我能想到的唯一可能會讓您到達那里的方法是在JNI之類的東西中進行本機調用,但我什至不知道從哪里開始。
這是一個非常古老的帖子,我發現它有點相關: java socket and web programming
從它的外觀來看,您正在嘗試將傳入的字節數組讀取為字符串行。 如果是這樣,這就是我在不遺漏一行的情況下讀取行的方法(在 Kotlin 中):
socket.getInputStream().bufferedReader(Charsets.UTF_8).forEachLine {
it -> { /* Do what you wanna do with the input */ }
}
在 Java 中,它的抽象程度要低得多:
BufferedReader(InputStreamReader(socket.getInputStream(), Charsets.UTF_8), 8 * 1024)
然后,使用此緩沖閱讀器中的行作為行序列來讀取傳入的行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.