最近在做一个项目,关于IPMI的.主要就是想通过网卡发一个广播包出去,然后再接受回来的包,分析其中的数据部分。
但我的JAVA程序在Windows下面跑没什么问题,可以抓到回来的包,可是在Linux下面就不可以了。没有任何的错误信息,但就是得不到回来的包。 希望各位java达人解答。....
以下是代码...import java.io.*;
import java.net.*;
import java.util.*;public class Test{
public byte retryFlag = 0;
public int RETRYNUMBER = 2;
public byte RAKPStatusCode = 0;
public byte IPMICompletionCode = 0;
public byte errorLocation = 0;
public byte communicationErrorFlag = 0;
public byte managedRandomNumber2[] = new byte[16];
public byte consoleSessionID2[] = new byte[4];
public byte sik[] = new byte[20];
public byte[] k1 = new byte[20];
String realPath = new String("");
// Member variable
DatagramPacket sendPacket, receivePacket;
byte sendBuffer[] = new byte[200];
byte receiveBuffer[] = new byte[400];
public InetAddress remoteAddress; // Remote IPMI Card Address
public InetAddress localaddress; // local Address
public InetAddress javaaddress; // local Address
public String[] ret = null;
public InetAddress[] addrs=null;
public String lcaddress= new String("");
public DatagramSocket socket; // Socket to send RMCP+
public int authenticationAlgorithm;
public int integrityAlgorithm;
public int confidentialityAlgorithm;
public byte[] managedSessionID = new byte[] {
0x00, 0x00, 0x00, 0x00}; // 0x00,0x02,0x00,0x02};
public byte[] consoleSessionID = new byte[] {
0x00, 0x00, 0x00, 0x00};
public byte[] SIK; // Session Integrity Key
public byte[] managedRandomNumber = new byte[16];
public byte[] consoleRandomNumber = new byte[16];
public byte[] managedSystemGUID = new byte[16];
public byte[] keyExhangeAuthenticationCode = new byte[20];
public byte[] integrityCheckValue = new byte[20]; public byte[] sequenceNumber = new byte[] {
0x00, 0x00, 0x00, 0x00
};
public static ArrayList lciplist;
public Test() {
lciplist=new ArrayList();
}
public static int b2iu(byte b) {
return b < 0 ? b & 0x7F + 128 : b;
}
public void setRealPath(String realPath) {
this.realPath = realPath;
}
public byte sendReceiveMessage() throws IOException {
/*
Process send and receive message
*/ socket=new DatagramSocket(623,javaaddress);
socket.setSoTimeout(5000);
socket.setBroadcast(true);
int supportipmi;
try
{ socket.send(sendPacket);
while(true)
{
socket.receive(receivePacket);
if((receiveBuffer[20]&0x80)==0x80)
supportipmi=1;
else
{supportipmi=0;
continue;
}
if(supportipmi==1)
{
localaddress=receivePacket.getAddress();
System.out.println("localaddress is "+localaddress.toString());
String ipaddress= localaddress.toString();
System.out.println("localaddress is "+ipaddress); for(int m=0;m<receiveBuffer.length-300;m++)
{
System.out.println("receivebuffer "+m+" is "+receiveBuffer[m]);
}
for(int tt=0;tt<receiveBuffer.length;tt++)
receiveBuffer[tt]=0;
receivePacket = new DatagramPacket(receiveBuffer, receiveBuffer.length); }
else
System.out.println("don't support ipmi"); } }
catch (SocketTimeoutException ste)
{
System.out.println("Timeout!");
socket.close();
return 0;
} catch (InterruptedIOException E) {
System.out.println("ST: Interrupted IO Works !: "+E.getMessage());
return 0;
}
catch (Exception E) {
System.out.println("ST: Exception: "+E.getMessage());
return 0;
} }
public ArrayList getipadd(){
return this.lciplist;
}
但我的JAVA程序在Windows下面跑没什么问题,可以抓到回来的包,可是在Linux下面就不可以了。没有任何的错误信息,但就是得不到回来的包。 希望各位java达人解答。....
以下是代码...import java.io.*;
import java.net.*;
import java.util.*;public class Test{
public byte retryFlag = 0;
public int RETRYNUMBER = 2;
public byte RAKPStatusCode = 0;
public byte IPMICompletionCode = 0;
public byte errorLocation = 0;
public byte communicationErrorFlag = 0;
public byte managedRandomNumber2[] = new byte[16];
public byte consoleSessionID2[] = new byte[4];
public byte sik[] = new byte[20];
public byte[] k1 = new byte[20];
String realPath = new String("");
// Member variable
DatagramPacket sendPacket, receivePacket;
byte sendBuffer[] = new byte[200];
byte receiveBuffer[] = new byte[400];
public InetAddress remoteAddress; // Remote IPMI Card Address
public InetAddress localaddress; // local Address
public InetAddress javaaddress; // local Address
public String[] ret = null;
public InetAddress[] addrs=null;
public String lcaddress= new String("");
public DatagramSocket socket; // Socket to send RMCP+
public int authenticationAlgorithm;
public int integrityAlgorithm;
public int confidentialityAlgorithm;
public byte[] managedSessionID = new byte[] {
0x00, 0x00, 0x00, 0x00}; // 0x00,0x02,0x00,0x02};
public byte[] consoleSessionID = new byte[] {
0x00, 0x00, 0x00, 0x00};
public byte[] SIK; // Session Integrity Key
public byte[] managedRandomNumber = new byte[16];
public byte[] consoleRandomNumber = new byte[16];
public byte[] managedSystemGUID = new byte[16];
public byte[] keyExhangeAuthenticationCode = new byte[20];
public byte[] integrityCheckValue = new byte[20]; public byte[] sequenceNumber = new byte[] {
0x00, 0x00, 0x00, 0x00
};
public static ArrayList lciplist;
public Test() {
lciplist=new ArrayList();
}
public static int b2iu(byte b) {
return b < 0 ? b & 0x7F + 128 : b;
}
public void setRealPath(String realPath) {
this.realPath = realPath;
}
public byte sendReceiveMessage() throws IOException {
/*
Process send and receive message
*/ socket=new DatagramSocket(623,javaaddress);
socket.setSoTimeout(5000);
socket.setBroadcast(true);
int supportipmi;
try
{ socket.send(sendPacket);
while(true)
{
socket.receive(receivePacket);
if((receiveBuffer[20]&0x80)==0x80)
supportipmi=1;
else
{supportipmi=0;
continue;
}
if(supportipmi==1)
{
localaddress=receivePacket.getAddress();
System.out.println("localaddress is "+localaddress.toString());
String ipaddress= localaddress.toString();
System.out.println("localaddress is "+ipaddress); for(int m=0;m<receiveBuffer.length-300;m++)
{
System.out.println("receivebuffer "+m+" is "+receiveBuffer[m]);
}
for(int tt=0;tt<receiveBuffer.length;tt++)
receiveBuffer[tt]=0;
receivePacket = new DatagramPacket(receiveBuffer, receiveBuffer.length); }
else
System.out.println("don't support ipmi"); } }
catch (SocketTimeoutException ste)
{
System.out.println("Timeout!");
socket.close();
return 0;
} catch (InterruptedIOException E) {
System.out.println("ST: Interrupted IO Works !: "+E.getMessage());
return 0;
}
catch (Exception E) {
System.out.println("ST: Exception: "+E.getMessage());
return 0;
} }
public ArrayList getipadd(){
return this.lciplist;
}
addrs=new InetAddress[100];
int number=0;
Properties props=System.getProperties();
props.setProperty("java.net.preferIPv4Stack", "true");
Test pingpong=new Test();
this.realPath=realPath1;
System.out.println("realpath is "+realPath);
try {
Enumeration netInterfaces = null;
try {
netInterfaces = NetworkInterface.getNetworkInterfaces(); while (netInterfaces.hasMoreElements()) { NetworkInterface ni = (NetworkInterface) netInterfaces.nextElement();
System.out.println("DisplayName:" + ni.getDisplayName());
System.out.println("Name:" + ni.getName()); Enumeration ips = ni.getInetAddresses();
while (ips.hasMoreElements()) {
NetworkInterface myInterface=NetworkInterface.getByInetAddress((InetAddress)ips.nextElement());
List<InterfaceAddress> list=myInterface.getInterfaceAddresses();
Iterator<InterfaceAddress> iter=list.iterator();
InetAddress inet=null;
InterfaceAddress inf=null;
while(iter.hasNext()){
inf=iter.next();
inet=inf.getAddress();
javaaddress=inet;
inet=inf.getBroadcast();
if(null==inet.getHostAddress())
break;
System.out.println("IP:"+ inet.getHostAddress());
String IPAddress1 = new String("");
IPAddress1=inet.getHostAddress();
// pingpong.remoteAddress = InetAddress.getByName("192.168.10.1");
pingpong.remoteAddress = InetAddress.getByName(IPAddress1);
System.out.println("IPAddress = " + inet.getHostAddress());
PINGRequest rmcprequest=new PINGRequest();
PONGResponse rmcpresponse =new PONGResponse(); rmcprequest.rmcpheader.Version=0x06;
rmcprequest.rmcpheader.Reserved=0x00;
rmcprequest.rmcpheader.SequenceNumber=(byte)0x10;
rmcprequest.rmcpheader.MessageClass=0x06;
rmcprequest.asfmessage.EnterpriseNumber[0]=0x00;
rmcprequest.asfmessage.EnterpriseNumber[1]=0x00;
rmcprequest.asfmessage.EnterpriseNumber[2]=0x11;
rmcprequest.asfmessage.EnterpriseNumber[3]=(byte)0xbe;
rmcprequest.asfmessage.MessageType=(byte)0x80;
rmcprequest.asfmessage.MessageTag=0x10;
rmcprequest.asfmessage.Reserved=0x00;
rmcprequest.asfmessage.DataLength=0x00;
System.out.println("rmcprequest.rmcpheader.Version is "+(byte)rmcprequest.rmcpheader.Version);
pingpong.sendMessage(rmcprequest,rmcpresponse);
}
}
}
}
catch (Exception e) {
e.printStackTrace();
}
}catch(Exception e){
e.printStackTrace();
}
} public static void main(String [] args){
Test pingpong=new Test();
pingpong.seach("123"); }
public byte sendMessage(PINGRequest rmcpRequest, PONGResponse rmcpResponse) throws
IOException {
sendBuffer[0] = rmcpRequest.rmcpheader.Version;
sendBuffer[1] = rmcpRequest.rmcpheader.Reserved;
sendBuffer[2] = rmcpRequest.rmcpheader.SequenceNumber;
sendBuffer[3] = rmcpRequest.rmcpheader.MessageClass;
sendBuffer[4] = rmcpRequest.asfmessage.EnterpriseNumber[0];
sendBuffer[5] = rmcpRequest.asfmessage.EnterpriseNumber[1];
sendBuffer[6] = rmcpRequest.asfmessage.EnterpriseNumber[2];
sendBuffer[7] = rmcpRequest.asfmessage.EnterpriseNumber[3];
sendBuffer[8] = rmcpRequest.asfmessage.MessageType;
sendBuffer[9] = rmcpRequest.asfmessage.MessageTag;
sendBuffer[10] = rmcpRequest.asfmessage.Reserved;
sendBuffer[11] = rmcpRequest.asfmessage.DataLength;
// Build the packet
sendPacket = new DatagramPacket(sendBuffer, sendBuffer.length, remoteAddress , 623);
System.out.println("25555555555555555555555555555555");
receivePacket = new DatagramPacket(receiveBuffer, receiveBuffer.length);
retryFlag = -1;
communicationErrorFlag = 0;
for (int p = 0; p < RETRYNUMBER; p++) {
if (sendReceiveMessage() == 0) {
retryFlag = 0;
// System.out.println("Error1 at sendMessage()");
break; // If successful out of loop
} System.out.println("Error1 at sendMessage()");
int q = 1000;
for (int x = 0; x < 4000; x++) {
for (int y = 0; y < 1000; y++) {
q = q / 2;
}
}
}
if (retryFlag != 0) {
communicationErrorFlag = 1; // Indicate network error
System.out.println("Error at sendMessage()");
return -1; // Indicate timeout occurred
} return 0;
} // End of sendMessage method
}
class PINGRequest {
// RMCP Request message format public RMCPHeaderEXE rmcpheader;
public ASFMessage asfmessage;
public PINGRequest(){ rmcpheader= new RMCPHeaderEXE();
asfmessage= new ASFMessage();
}
}
class RMCPHeaderEXE{
public byte Version;
public byte Reserved;
public byte SequenceNumber;
public byte MessageClass;
public RMCPHeaderEXE(){
}
}
class ASFMessage{
public byte[] EnterpriseNumber;
public byte MessageType;
public byte MessageTag;
public byte Reserved;
public byte DataLength;
ASFMessage(){
EnterpriseNumber = new byte[4];
}
}
class UDPHeader{
public byte sourceport[] = new byte[2];
public byte DestinationPort[] = new byte[2];
public byte UDPLength[] = new byte[2];
public byte UDPChecksum[] = new byte[2];
}class PONGResponse{ public RMCPHeaderEXE rmcpheader;
public ASFMessageResponse asfmessage;
public PONGResponse(){ rmcpheader=new RMCPHeaderEXE();
asfmessage=new ASFMessageResponse();
}
}
class ASFMessageResponse{
public byte[] EnterpriseNumber;
public byte MessageType;
public byte MessageTag;
public byte Reserved;
public byte DataLength;
public byte[] EnterpriseNumberex;
public byte[] OemDefined;
public byte SupportedEntities;
public byte SupportedInteractions;
public byte Reservedex;
public ASFMessageResponse(){
EnterpriseNumber = new byte[4];
EnterpriseNumberex = new byte[4];
OemDefined = new byte[4];
}
}
2.2.6的内核linux默认把ipv6协议打开了,在跨网段时如果交换机或路由器不支持ipv6,也是无法收到的
我用 Properties props=System.getProperties();
props.setProperty("java.net.preferIPv4Stack", "true");
禁用的IPV6的协议, 还有我广播的地址是在同一网段内的。比如机器的IP=192.168.1.10 子网掩码是255.255.255.0 那么我广播的地址一定是192.168.1.255
应该是不跨越路由的啊.
我在命令行下,用 ping 192.168.1.255 -b可以接受到回应.