2015-06-10 79 views
0

我正在創建一個FTP服務器。根據FTP規範,他們添加了一個名爲LPRT的新命令。如何從LPRT ftp命令獲取IPv6

它的格式是LPRT 6,16,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,2,193,160

現在我能夠使用下面的邏輯從它獲得FTP端口。但是我也需要這個字符串的IPV6地址。

public static void main(String[] args) { 
    StringTokenizer st = new StringTokenizer(
      "6,16,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,2,193,160"); 

     final String portStr = st.nextToken(); 
     final int lastDelimIdx =portStr.lastIndexOf(',', portStr.lastIndexOf(',') - 1); 
     final StringTokenizer portst = new StringTokenizer(portStr.substring(lastDelimIdx + 1, portStr.length()), ","); 
     final int p1 = Integer.parseInt(portst.nextToken()); 
     final int p2 = Integer.parseInt(portst.nextToken()); 
     final int dataPort = (p1 << 8) | p2; 
     System.out.println(dataPort); 
} 

有人可以幫我找到這個字符串的IPv6地址。

回答

1

LPRT和LPSV被認爲是過時的,參見https://www.iana.org/assignments/ftp-commands-extensions/ftp-commands-extensions.txt。要使用IPv6,請使用RFC2428中指定的EPSV和EPRT。

如果您仍然需要知道如何處理LPRT,請查看過時的RFC1639。例如:

LPRT 6,16,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,2,193,160 

意味着宿主長度參數後的16個數字是該地址的字節,然後如下所述端口地址長度用2個字節,即

[0000:0000:0000:0000:0300:0000:0000:0000]:49568 
+0

是的,你說得對,但是我們的實施說明如果EPRT失敗,那麼使用LPRT因此我們必須使用它 –

+0

我檢查了這個鏈接,但是不幸的是,我沒有找到他們如何代表IPv6格式 –

+0

@ShowStopper:我認爲這很清楚,但看到編輯問題中的示例。 –

0

我創建了一個程序,它執行此萃取

public static String longToIP(long[] ip) { 
    String ipString = ""; 

    int flag = 0; 
    for (long crtLong : ip) { 

     if (flag == 2) { 
      ipString = ipString + ":"; 
      flag = 0; 
     } 
     String s = Long.toHexString(crtLong & 0xFFFFFFFFL); 
     if (s.length() == 1) { 
      s = "0" + s; 
     } 
     ipString = ipString + "" + s; 
     flag++; 

    } 
    return ipString; 

} 

輸入= {0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0}

OutPut = {0000:0000:0000:0000:0300:0000:0000:0000}