簡體   English   中英

Java Socket 數據包攔截

[英]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.

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