Классы commtrace не работают в режиме реального времени. Они используют файл трассировки, созданный на сервере IBM i ранее. Чтобы создать этот файл трассировки, см. Javadoc для com .ibm.as400.util.commtrace.CommTrace В основном вам потребуется выполнить команды IBM i STRCMNTRC
, ENDCMNTRC
и DMPCMNTRC
. Затем используйте commtrace.CommTrace, чтобы создать файл трассировки, отформатированный так, чтобы другие классы commtrace могли его прочитать.
EDIT: добавьте фрагмент кода из 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();
}
}
}
EDIT: более подробная информация
1) В системе IBM кто-то со специальными полномочиями должен запустить STRCMNTRC
и собрать информацию о трассировке связи. Этот файл трассировки содержит все TCP-пакеты, которые передавались между системой IBM и внешним миром. Например, если трассировка выполняется в течение часа, она будет собирать все пакеты, отправленные и полученные системой в течение этого часа. Данные трассировки хранятся в специальном формате и не могут быть прочитаны напрямую.
2) Чтобы сделать данные трассировки доступными для чтения, используйте команду DMPCMNTRC
. Это создаст простой файл текстового потока из данных трассировки. Эти данные должны попасть на ваш компьютер, чтобы com.ibm.as400.util.commtrace
классы могли с ними работать.
3) На вашем ПК запустите com.ibm.as400.util.commtrace.CommTrace
. Это создаст файл в простой текстовой форме, которую com.ibm.as400.util.commtrace
сможет обработать. Я поставил свой в /buck/linetrace
. Важно понимать, что в этом журнале сотни или тысячи пакетов, и каждый из них содержит информацию, о которой вы спрашиваете в вопросе. Нет ни одного флага ACK, их много сотен. Чтобы понять, что происходит, ваша программа должна будет прочитать пакет, получить заголовок, затем статус, получить данные, а затем прочитать следующий пакет, и еще, и еще, и так до конца.
4) Для фильтрации по IP-адресу вы можете либо использовать setFilterProperties()
, либо ваш код проверяет IP-адреса в каждом заголовке пакета и обрабатывает только те заголовки, которые вы хотите.
Важно понимать, что «статус», который вы ищете, не является свойством IP-адреса, это свойство TCP-пакета. Невозможно запросить у системы флаг ACK IP-адреса, потому что нет такого возвращаемого свойства. Единственный способ получить эти данные — записать их в тот момент, когда пакет считывается или записывается системой.
Я был бы очень удивлен, если бы вам действительно понадобились эти флаги; почти никто не делает. Обычно «состояние подключения» означает способ определить, работает машина или нет. ping
— типичный ответ на этот вопрос, но не все машины ответят на пинг. Для этих машин лучше всего попытаться подключиться к машине и порту, которые вы хотите протестировать.
person
Buck Calabro
schedule
07.05.2013