最近在做一个项目,关于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;
}

解决方案 »

  1.   

    接楼上. public void seach(String realPath1){
    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.   

    1.考虑一下linux的防火墙
    2.2.6的内核linux默认把ipv6协议打开了,在跨网段时如果交换机或路由器不支持ipv6,也是无法收到的
      

  3.   

    首先谢谢你的回复,
    我用 Properties props=System.getProperties(); 
    props.setProperty("java.net.preferIPv4Stack", "true"); 
    禁用的IPV6的协议, 还有我广播的地址是在同一网段内的。比如机器的IP=192.168.1.10 子网掩码是255.255.255.0 那么我广播的地址一定是192.168.1.255
    应该是不跨越路由的啊. 
      

  4.   

    补充一点.
    我在命令行下,用 ping 192.168.1.255 -b可以接受到回应.