我试图获得AS400 TCP连接状态。但是我失败了:(任何人都可以帮我做这个。我是JT400 java开发的新手。请帮帮我朋友。
请帮帮我 谢谢!
编辑:
我得到了这个课程
com.ibm.as400.util.commtrace.TCPHeader
返回此信息
getACKFlag()
getAckNum()
getCheckSum()
getCWRFlag()
getDataOffset()
getDstPort() ..etc
现在我想得到这个信息。它的意思是,如何使用这个类来获取TCP状态。
请帮帮我
谢谢
答案 0 :(得分:3)
获取作业的IP地址:
System.out.println("IP address " + job.getValue(job.CLIENT_IP_ADDRESS));
答案 1 :(得分:2)
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标志,有数百个。为了理解发生了什么,你的程序需要读取数据包,获取标题,然后获取状态,获取数据,然后读取下一个数据包,然后读取下一个数据包,以及所有数据。< / p>
4)为了按IP地址过滤,您可以使用setFilterProperties()
或让您的代码检查每个数据包标头中的IP地址,只处理您想要的标头。
重要的是要了解您正在寻找的'status'不是IP地址的属性,它是TCP数据包的属性。无法向系统询问IP地址的ACK标志,因为没有返回此类属性。获取这些东西的唯一方法是在系统读取或写入数据包的瞬间记录它们。
如果你真的需要这些旗帜,我会非常惊讶;几乎没有人这样做。通常,“连接状态”表示确定机器是否正在运行的方法。ping
是回答该问题的典型方法,但并非所有计算机都会回答ping。对于这些机器,最好的方法是尝试连接到您要测试的机器和端口。