commtrace 类不是实时的。他们使用早先在 IBM i 服务器上创建的跟踪文件。为了创建该跟踪文件,请参阅 com.ibm.as400.util.commtrace.CommTrace 的 Javadoc基本上您 将需要运行 IBM i 命令STRCMNTRC
和. 然后使用 commtrace.CommTrace 创建一个格式化的跟踪文件,以便其他 commtrace 类可以读取它。 ENDCMNTRC
DMPCMNTRC
编辑:从 commtrace.Format Javadoc 添加代码片段
import java.util.*;
import com.ibm.as400.access.*;
import com.ibm.as400.util.commtrace.*;
public class TestCommTrace {
public static void main(String[] args) {
try {
Format f = new Format("/buck/linetrace");
FormatProperties fmtprop = new FormatProperties();
f.setFilterProperties(fmtprop); // Sets the filtering properties for this Format
f.formatProlog(); // Format the prolog
Prolog pro = f.getProlog();
System.out.println(pro.toString());
if(!pro.invalidData()) { // This is not a valid trace
Frame rec;
while((rec=f.getNextRecord())!=null) { // Get the records
System.out.print("Frame " + rec.getRecNum().toString()); // Print out the Frame Number
System.out.println(" time " + rec.getTime().toString()); // Print out the time
IPPacket p = rec.getPacket(); // Get this records packet
Header h = p.getHeader(); // Get the first header
if(p.getType()==IPPacket.IP4) { // If IP4 IPPacket
if(h.getType()==Header.IP4) { // If IP4 Header
IP4Header ip4 = (IP4Header) h; // Cast to IP4 so we can access methods
System.out.println(h.getName()); // Print the name
System.out.println("IP4 src:"+ip4.getSrcAddr() + " dst:" + ip4.getDstAddr());
System.out.println(ip4.printHexHeader()); // Print the header as hex
// Print a string representation of the header.
System.out.println(ip4.toString()); // hex string
//System.out.println(ip4.toString(fmtprop)); // very detailed
while((h=h.getNextHeader())!=null) { // Get the rest of the headers
if(h.getType()==Header.TCP) { // If its a TCP header
TCPHeader tcp = (TCPHeader) h; // Cast so we can access methods
System.out.println("TCP src:" + tcp.getSrcPort() + " dst:" + tcp.getDstPort() + " checksum:" + tcp.getCheckSum());
System.out.println(tcp.toString()); // hex string
//System.out.println(tcp.toString(fmtprop)); // very detailed
} else if(h.getType()==Header.UDP) { // If its a UDP header
UDPHeader udp = (UDPHeader) h; // Cast so we can access methods
System.out.println("UDP src:" + udp.getSrcPort() + " dst:" + udp.getDstPort());
System.out.println(udp.toString());
}
}
}
}
}
f.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
编辑:一些更详细的信息
1) 在 IBM 系统上,必须由具有特殊权限的人运行STRCMNTRC
和收集通信跟踪信息。此跟踪文件包含在 IBM 系统和外部世界之间流动的所有 TCP 数据包。例如,如果跟踪运行一个小时,它将收集系统在该小时内发送和接收的每个数据包。跟踪数据以特殊的格式存储,不能直接读取。
2) 要使跟踪数据可读,请使用DMPCMNTRC
命令。这将从跟踪数据中创建一个平面文本流文件。此数据需要到达您的 PC,以便com.ibm.as400.util.commtrace
课程可以使用它。
3) 在您的 PC 上,运行com.ibm.as400.util.commtrace.CommTrace
. 这将以可以处理的简单文本形式创建一个文件com.ibm.as400.util.commtrace
。我把我的放进去/buck/linetrace
。重要的是要了解此日志中有数百或数千个数据包,每个数据包都有您在问题中询问的信息。没有一个单一的 ACK 标志,有数百个。为了理解发生了什么,你的程序需要读取一个数据包,获取包头,然后是状态,获取数据,然后读取下一个数据包,下一个数据包,下一个数据包,一直到所有这些。
4) 为了按 IP 地址过滤,您可以使用setFilterProperties()
或让您的代码检查每个数据包标头中的 IP 地址,并且只处理您想要的标头。
重要的是要了解您要查找的“状态”不是 IP 地址的属性,而是 TCP 数据包的属性。无法向系统询问 IP 地址的 ACK 标志,因为没有要返回的此类属性。获得这些东西的唯一方法是在系统读取或写入数据包的那一刻记录它们。
如果您真的需要这些标志,我会感到非常惊讶;几乎没有人这样做。通常,“连接状态”是一种确定机器是否正在运行的方法。 ping
是回答该问题的典型方法,但并非所有机器都会回答 ping。对于那些机器,最好的方法是尝试连接到您要测试的机器和端口。