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

3

要获取作业的 IP 地址:

System.out.println("IP address " + job.getValue(job.CLIENT_IP_ADDRESS));
于 2013-05-06T14:54:24.917 回答
2

commtrace 类不是实时的。他们使用早先在 IBM i 服务器上创建的跟踪文件。为了创建该跟踪文件,请参阅 com.ibm.as400.util.commtrace.CommTrace 的 Javadoc基本上 将需要运行 IBM i 命令STRCMNTRC和. 然后使用 commtrace.CommTrace 创建一个格式化的跟踪文件,以便其他 commtrace 类可以读取它。 ENDCMNTRCDMPCMNTRC

编辑:从 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。对于那些机器,最好的方法是尝试连接到您要测试的机器和端口。

于 2013-05-07T01:42:00.253 回答