commtrace クラスはリアルタイムではありません。彼らは、IBM i サーバー上で以前に作成されたトレース ファイルを使用します。そのトレース ファイルを作成するには、com.ibm.as400.util.commtrace.CommTraceSTRCMNTRC
の Javadoc を参照してください。基本的には、IBM i コマンドを 実行する必要がありENDCMNTRC
ますDMPCMNTRC
。次に、commtrace.CommTrace を使用して、他の commtrace クラスが読み取れるようにフォーマットされたトレース ファイルを作成します。
編集: 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 パケットが含まれています。たとえば、トレースを 1 時間実行すると、その時間にシステムが送受信したすべてのパケットが収集されます。トレース データは特殊な形式で保存され、直接読み取ることはできません。
2) トレース データを読み取り可能にするには、次のDMPCMNTRC
コマンドを使用します。これにより、トレース データからフラット テキスト ストリーム ファイルが作成されます。このデータは、com.ibm.as400.util.commtrace
クラスが作業できるように PC に到達する必要があります。
3) PC で を実行しますcom.ibm.as400.util.commtrace.CommTrace
。これにより、処理可能な単純なテキスト形式でファイルが作成されますcom.ibm.as400.util.commtrace
。私は私のものを入れました/buck/linetrace
。このログには数百または数千のパケットがあり、そのすべてに質問で尋ねた情報が含まれていることを理解することが重要です。ACK フラグは 1 つではなく、何百ものフラグがあります。何が起こっているのかを理解するために、プログラムはパケットを読み取り、ヘッダーを取得し、次にステータスを取得し、データを取得してから次のパケットを読み取り、次のパケットと次のパケットをすべて読み取る必要があります。
4) IP アドレスでフィルタリングするにsetFilterProperties()
は、コードを使用するか、各パケット ヘッダーの IP アドレスをチェックして、必要なヘッダーのみを処理することができます。
探している「ステータス」は IP アドレスのプロパティではなく、TCP パケットのプロパティであることを理解することが重要です。返されるプロパティがないため、システムに IP アドレスの ACK フラグを要求する方法はありません。これらを取得する唯一の方法は、システムによってパケットが読み取られるか書き込まれる瞬間にそれらを記録することです。
これらのフラグが本当に必要な場合は、非常に驚かれることでしょう。ほとんど誰もしません。通常、「接続ステータス」とは、マシンが実行されているかどうかを判断する方法を意味します。 ping
がその質問に答える一般的な方法ですが、すべてのマシンが ping に応答するわけではありません。これらのマシンの場合、テストしたいマシンとポートに接続してみるのが最善の方法です。