我已经用JNA实现了GetExtendedTcpTable(),但是当我使用该函数时,会收到错误消息:
java.lang.IndexOutOfBoundsException: Bounds exceeds available space : size=28, offset=52
我的功能的定义如下:
public interface IPHlpAPIExtended extends IPHlpAPI {
IPHlpAPIExtended INSTANCE = Native.load("IPHlpAPI", IPHlpAPIExtended.class, W32APIOptions.DEFAULT_OPTIONS);
int GetExtendedTcpTable( MIB_TCPTABLE_OWNER_PID pTcpTable, IntByReference pdwSize, boolean bOrder, int ulAf, int TableClass, int Reserved );
@Structure.FieldOrder( { "dwNumEntries", "table" } )
public static class MIB_TCPTABLE_OWNER_PID extends Structure {
public WinDef.DWORD dwNumEntries;
public MIB_TCPROW_OWNER_PID[] table = new MIB_TCPROW_OWNER_PID[]{ new MIB_TCPROW_OWNER_PID() };
public MIB_TCPTABLE_OWNER_PID() {
}
public MIB_TCPTABLE_OWNER_PID( Pointer pointer ) {
super( pointer );
this.read();
}
@Override
public void read() {
super.read();
if ( dwNumEntries.intValue() > 0 ) {
table = ( MIB_TCPROW_OWNER_PID[] ) table[0].toArray( dwNumEntries.intValue() );
} else {
table = new MIB_TCPROW_OWNER_PID[]{ new MIB_TCPROW_OWNER_PID() };
}
}
}
}
和:
IPHlpAPIExtended.MIB_TCPTABLE_OWNER_PID pTcpTable = new IPHlpAPIExtended.MIB_TCPTABLE_OWNER_PID();
final IntByReference pdwSize = new IntByReference( 0 );
try {
if ( IPHlpAPIExtended.INSTANCE.GetExtendedTcpTable( pTcpTable, pdwSize, true, AF_INET,
IPHlpAPIExtended.TCP_TABLE_CLASS.TCP_TABLE_OWNER_PID_ALL.ordinal(), 0 ) == ERROR_INSUFFICIENT_BUFFER ) {
IPHlpAPIExtended.MIB_TCPTABLE_OWNER_PID newPTcpTable = new IPHlpAPIExtended.MIB_TCPTABLE_OWNER_PID( pTcpTable.getPointer() );
assertThat(
IPHlpAPIExtended.INSTANCE.GetExtendedTcpTable( newPTcpTable, pdwSize, true, AF_INET,
IPHlpAPIExtended.TCP_TABLE_CLASS.TCP_TABLE_OWNER_PID_ALL.ordinal(), 0 ) ).isEqualTo( NO_ERROR );
for ( int i = 0; i < newPTcpTable.dwNumEntries.intValue(); i++ ) {
final IPHlpAPIExtended.MIB_TCPROW_OWNER_PID row = newPTcpTable.table[i];
System.out.println( row.dwOwningPid.intValue() );
}
} else {
// TODO getLasError()
Assertions.fail( "GetExtendedTcpTable terminate with errors" );
}
} catch ( Throwable t ) {
t.printStackTrace();
}
dwNumEntries字段已正确填充。但行:
table = ( MIB_TCPROW_OWNER_PID[] ) table[0].toArray( dwNumEntries.intValue() );
引发异常。
编辑:
这是MIB_TCPROW_OWNER_PID的映射:
@Structure.FieldOrder( { "dwState", "dwLocalAddr", "dwLocalPort", "dwRemoteAddr", "dwRemotePort", "dwOwningPid" } )
public static class MIB_TCPROW_OWNER_PID extends Structure {
public WinDef.DWORD dwState;
public WinDef.DWORD dwLocalAddr;
public WinDef.DWORD dwLocalPort;
public WinDef.DWORD dwRemoteAddr;
public WinDef.DWORD dwRemotePort;
public WinDef.DWORD dwOwningPid;
}
问题出在MIB_TCPTABLE_OWNER_PID
结构的映射中,您已将第二个元素定义为数组,固定大小为1: