我试图获取AS400 TCP连接状态。但是我失败了:((谁能帮我做到这一点。我是JT400 Java开发的新手。请帮助我的朋友们。
我想获得一份工作的IP地址
我想使用该(1)IP地址获取TCP连接状态。
请帮我
谢谢!
编辑:
我上了这堂课
com.ibm.as400.util.commtrace.TCPHeader
返回此信息
getACKFlag()
getAckNum()
getCheckSum()
getCWRFlag()
getDataOffset()
getDstPort() ..etc
现在我想获得这些信息。它的意思是,如何使用此类获取TCP状态。
请帮我
谢谢
最佳答案
commtrace类不是实时的。他们使用在较早的时间在IBM i服务器上创建的跟踪文件。为了创建该跟踪文件,请参阅com.ibm.as400.util.commtrace.CommTrace的Javadoc。基本上,您将需要运行IBM i命令STRCMNTRC
,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数据包。例如,如果跟踪运行一个小时,它将收集该小时内系统发送和接收的每个数据包。跟踪数据以特殊格式存储,无法直接读取。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。对于这些计算机,最好的方法是尝试连接到要测试的计算机和端口。关于java - 举例说明JT400中的TCP连接状态-JAVA,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16395069/