1

AS400 TCP 接続ステータスを取得しようとしています。しかし、私は失敗しました:(誰かがこれを行うのを手伝ってくれますか。私はJT400 Java開発に不慣れです。友達を助けてください。

  1. 仕事のIPアドレスを取得したい
  2. その(1)IPアドレスを使用してTCP接続ステータスを取得したい。

助けてください ありがとうございます!

編集 :

私はこのクラスを取得しました

com.ibm.as400.util.commtrace.TCPHeader

この情報を返します

getACKFlag()
getAckNum()
getCheckSum()
getCWRFlag()
getDataOffset()
getDstPort() ..etc

今、私はこの情報を取得したいと考えています。つまり、このクラスを使用して TCP ステータスを取得する方法です。

私を助けてください

ありがとうございました

4

2 に答える 2

2

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 に応答するわけではありません。これらのマシンの場合、テストしたいマシンとポートに接続してみるのが最善の方法です。

于 2013-05-07T01:42:00.253 に答える