Toggle Theme Editor
Slate Blueberry Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate Charcoal

Thuật toán quét IP

Discussion in 'Trao đổi về thuật toán' started by sovo007007, 19/1/18.

  1. sovo007007

    sovo007007 Member

    Hiện tại mình đang làm cái phần mềm như kiểu IPscan hay advanced Ip scanner. Chức năng của nó là quét Ip từ địa chỉ start đến end, tuy nhiên theo như mình hiểu thuật toán của nó thì nó quét lần lượt theo thứ tự ví dụ: start: 1.1.1.0 end: 1.1.1.255 thì nó sẽ quét từ 1.1.1.0-255. Nếu với trường hợp quét như vậy thì nói chung còn đỡ và sớm cho ra kết quả vì chỉ quét 256 địa chỉ IP là oke. Tuy nhiên nếu quét từ 0.0.0.0 - 255.255.255.255 thì mình nghĩ chắc chết toi. Ngồi nghĩ mãi mà chưa ra thuật toán quét kiểu để nhanh hơn thay vì quét từng IP lần lượt. Nẩy ra ý tưởng là vì dụ cần quét xem địa chỉ 222.111.10.2 có không thì quét dải A trước rồi so sánh sau đó đến dải B rồi C đem so sánh, tức là đầu tiên quét xem 222 có ko? sau đó đến 111 rồi 10 rồi đến 2 thì như thế số lần quét chỉ là 256x4 thay vì 256x256x256x256 lần. Mà ý tưởng đó ko biết xử lý ở java như thế nào ạ. Mong các bậc tiền bối cho ý tưởng ạ.!
     
  2. JackV

    JackV Administrator Staff Member

    Nói chung là cần quét tất cả thì phải quét tất cả chứ nếu bỏ qua cái nào đó thì còn gì là tất cả nữa bạn. Dùng multithread đi.
     
  3. sovo007007

    sovo007007 Member

    Mình hiểu nhưng hôm rồi nghĩ ra kiểu là: Ví dụ quét lớp A từ 0 - 255 xem có thằng nào có IP lớp A trong dải đó ko? ví dụ có 11, 22, 33, 44. sau đó giữ lần lượt các giá trị lớp A để quét tiếp lớp B... làm như thế đến lớp C và cuối cùng. Sẽ cho ra được các đc IP ping đến được. Như thế nó sẽ nhanh hơn hẳn là ta quét từ 0.0.0.0 đến 255.255.255.255 mỗi tội là ko biết java viết kiểu gì để quét từng lớp như vậy? còn quét IP để đảm bảo thì chắc chắn dùng multithead rồi :)
     
  4. JackV

    JackV Administrator Staff Member

    Nhưng mà tạo sao phải giữ giá trị của lớp A để quét tiếp lớp B trong khi mỗi IP là xác định vào không liên quan đến nhau?
     
    sovo007007 likes this.
  5. dùng regex để quét sẽ đảm bảo nhanh
     
  6. Nancru

    Nancru CongDongJava Project Leader Staff Member

    Làm chưa mà biết nhanh ?

    Dãy Ipv4 có 4 cụm, mỗi cụm có giá trị từ 0->255. Vị chi là 256 giá trị, min của dãy sẽ là 0, và max của dãy là 256^4 = Integer.MAX_VALUE (no-signed).
    Ví dụ một dãy bất kỳ: 1.0.0.0 và 1.255.255.255. Em quy ra thành số và đặt chặn dưới = 16777216 và chặn trên = 33554431.
    Rồi ta xét một Ip bất kỳ: 2.255.255.255 = 50331647 và 1.32.4.0 = 18875392.
    Lúc này đem đi so sánh cơ bản sẽ thấy
    - 2.255.255.255 sẽ lớn hơn cả chặn trên => không thoả
    - 1.32.4.0 sẽ lớn hơn chặn dưới và nhỏ hơn chặn trên => thoả.

    Đây là thuật toán convert Ipv4 sang int:

    PHP:
        public static long convertIpToLong(String ipV4) {
            
    String[] addrArray ipV4.split("\\.");
            
    long num 0;
            for (
    int i 0addrArray.lengthi++) {
                
    int power i;
                
    num += ((Integer.parseInt(addrArray[i]) % 256) * Math.pow(256power));
            }
            return 
    num;
        }
    ============ Updated
    Sau khi review lại thì anh quên mất do Java là signed-integer nên chỉ chứa được 2 tỷ 1 < 4tỷ = 256^4. Đã update lại kết quả trả ra của function trên thành long
     
    Last edited: 30/1/18
    sovo007007, JackV and D.A.N_3002 like this.

Chia sẻ trang này

Loading...