Форум jimm.net.ru

  • Вы не зашли.

#1 2010-02-06 15:27:11

DemonBess
Пользователь
Зарегистрирован: 2010-02-06
Сообщений: 2
Профиль

J2se

Сори что не по теме мода немного..но по MRIM.. пытаюсь реализовать протокол
Но не приходит ответ на пакет для аутентификации юзера

попробывал на основе исходников мода набросать..вот что получилось....если есть ошибки..ткните пальцем плиз

Спойлер:

public class Pages {
/////////////////////////////////////////////////////
    public static  final int CS_MAGIC = 0xDEADBEEF;
    public static  final int PROTO_VERSION    = 0x1000A;
    public static final int STATUS_FLAG_INVISIBLE = 0x80000000;

    public static  final int MRIM_CS_HELLO     = 0x1001;   
    public static  final int MRIM_CS_HELLO_ACK     = 0x1002;
    public static  final int MRIM_CS_LOGIN2      = 0x1038;
    public static  final int MRIM_CS_LOGIN_ACK     = 0x1004;
    public static  final int MRIM_CS_LOGIN_REJ     = 0x1005;
    public static  final int MRIM_CS_PING     = 0x1006;
    public static  final int MRIM_CS_USER_STATUS    = 0x100F;
    public static  final int  STATUS_ONLINE    = 0x00000001;
    public static  final int MRIM_CS_MESSAGE     = 0x1008;
    public static  final int MESSAGE_FLAG_NORECV = 0x00000004;
     public static final int MRIM_CS_CHANGE_STATUS = 0x1022;
     ////////////////////////////////////////////////////
    protected int seq = 0;//щотчиг пакетов
    public Pages(){}
   
    public byte[] HELLO(){
   
         return getPaket(MRIM_CS_HELLO);
    }
   
 
   
    public static long getDWordLE(byte[] buf, int off) {
        long val;
        // Little endian
        val  = (((long) buf[off]))         & 0x000000FF;
        val |= (((long) buf[++off]) << 8)  & 0x0000FF00;
        val |= (((long) buf[++off]) << 16) & 0x00FF0000;
        val |= (((long) buf[++off]) << 24) & 0xFF000000;
        return val;
    }
    public static long getDWord(byte[] buf, int off, boolean bigEndian) {
        long val;
        if (bigEndian) {
            val  = (((long) buf[off]) << 24)   & 0xFF000000;
            val |= (((long) buf[++off]) << 16) & 0x00FF0000;
            val |= (((long) buf[++off]) << 8)  & 0x0000FF00;
            val |= (((long) buf[++off]))       & 0x000000FF;
        } else {
            // Little endian
            val  = (((long) buf[off]))         & 0x000000FF;
            val |= (((long) buf[++off]) << 8)  & 0x0000FF00;
            val |= (((long) buf[++off]) << 16) & 0x00FF0000;
            val |= (((long) buf[++off]) << 24) & 0xFF000000;
        }
        return val;
    }
    public static int endian( int x )
    {
        int a = x >>> 24;
        int b = ( x >>> 16 ) & 0xff;
        int c = ( x >>> 8 ) & 0xff;
        int d = x & 0xff;
        x = ( d << 24 ) | ( c << 16 ) | ( b << 8 ) | a;
        return x;
    }
    public byte[] getPaket(int index, byte[] b){
   
            ByteBuffer Packet = ByteBuffer.allocate(44+b.length);   
            Packet.putInt(endian(0xDEADBEEF)); // заголовок
          
            Packet.putInt(endian(0x010013));            // версия протокола
            Packet.putInt(endian(seq));               // номер сообщения...
            Packet.putInt(endian(index));             // команда
            Packet.putInt(endian(b.length));               // длинна данных
            Packet.putInt(0);               // локальный хост
            Packet.putInt(0); //локальный порт
           // Packet.putInt(0);
            Packet.putInt(0);               
            Packet.putInt(0);           
            Packet.putInt(0);             
            Packet.putInt(0); 
 
            Packet.put(b);
            System.out.println("Buffer size: "+Packet.limit()+" Bufer seted: "+Packet.remaining());
        Packet.flip();
   
        seq++;
        return Packet.array();
       
    }
   
    public byte[] getPaket(int index){
       
        ByteBuffer Packet = ByteBuffer.allocate(44);   
        Packet.putInt(endian(0xDEADBEEF)); // magic
      
        Packet.putInt(endian(0x010013));            // proto
        Packet.putInt(endian(seq));               // seq
        Packet.putInt(endian(index));             // команда
        Packet.putInt(endian(0));               // dlen
        Packet.putInt(0);               // from
        Packet.putInt(0); //fromport
        Packet.putInt(0);
        Packet.putInt(0);               // 1
        Packet.putInt(0);               // 2
        Packet.putInt(0);               // 3
      //  Packet.putInt(0); 
     //   System.out.println("Buffer memore: "+Packet.remaining());
     //   System.out.println("Byte linght: "+b.length);
      //  Packet.put(b);
    Packet.flip();
    seq++;
    return Packet.array();
   
}

   
   
   
    public static int STATUS_AWAY = 0x02;

    public byte[] getLogin() {
        MrimBuffer buf = new MrimBuffer();
        buf.putString("test@list.ru");
        buf.putString("password");
        buf.putInt(Pages.STATUS_ONLINE|Pages.STATUS_FLAG_INVISIBLE);
        buf.putString("Online");
        buf.putUcs2String("test");                   
        buf.putUcs2String("test");
        buf.putInt(0x0002 + 0x0004 + 0x0010 + 0x0020);
        buf.putString("client=\"magent\" version=\"5.3\" build=\"2546\"");
        buf.putString("ru");
        buf.putString("MRA 5.3 (build 2546)");
        return getPaket(this.MRIM_CS_LOGIN2,buf.getBytes());
    }
}

MrimBuffer:

Спойлер:

public class MrimBuffer {

    public ByteArrayOutputStream buf;
   
    public MrimBuffer(){
        buf = new ByteArrayOutputStream();
    }
    /*
     * Заносим число в буфер
     */
    public void putInt(int i){
        buf.write(endian(i));
    }
    /*
     * заносим строку в буфер
     */
    public void putString(String str){
        putInt(str.getBytes().length);
        putByte(str.getBytes());
    }
   
   

    /*
     * заносим байты в буфер
     */
    public void putByte(byte[] b){
        try {
            buf.write(b);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

   
     void putUcs2String(String str) {
            putInt(str.length() * 2);
            try {
                for (int i = 0; i < str.length(); ++i) {
                    char ch = str.charAt(i);
                    buf.write(ch & 0xFF);
                    buf.write((ch >> 8) & 0xFF);
                }
            } catch (Exception ex) {
            }
        }

     public static int endian( int x )
        {
            int a = x >>> 24;
            int b = ( x >>> 16 ) & 0xff;
            int c = ( x >>> 8 ) & 0xff;
            int d = x & 0xff;
            x = ( d << 24 ) | ( c << 16 ) | ( b << 8 ) | a;
            return x;
        }
    
     public byte[] getBytes(){
         return buf.toByteArray();
     }
    

}

Правильно ли собирает пакет процедура getLogin() ??

Неактивен

 

#2 2010-02-06 20:34:40

aspro
Прохожий
Зарегистрирован: 2007-03-24
Сообщений: 1768
Модель телефона: nokia 6233 & 5530
Профиль  Вебсайт

Re: J2se

Ошибки:
щотчиг - пишется как счетчик
memore - memory
linght - length
После знаков пунктуации ("),+|") ставить пробел.
"{" всегда ставится в конце предыдущей строки или в начале следующий.
Packet - значит класс Packet, packet - значит переменная packet.
"public ByteArrayOutputStream buf;" вообще дожно быть private.

Метод getLogin
Собирает правильно. А вот buf.write(ch & 0xFF); пишет судя по всему int а не byte.


Кто ты? Чего ты хочешь?

Неактивен

 

#3 2010-02-07 04:41:04

DemonBess
Пользователь
Зарегистрирован: 2010-02-06
Сообщений: 2
Профиль

Re: J2se

aspro написал:

А вот buf.write(ch & 0xFF); пишет судя по всему int а не byte.

Процедура putUcs2String() взята из исходников мода...ничего в ней не менял...

Неактивен

 

#4 2010-02-07 15:28:55

aspro
Прохожий
Зарегистрирован: 2007-03-24
Сообщений: 1768
Модель телефона: nokia 6233 & 5530
Профиль  Вебсайт

Re: J2se

Значит putInt(int i) пишет байт, а не дворд.


Кто ты? Чего ты хочешь?

Неактивен

 

Board footer

Powered by PunBB 1.2.14
© Copyright 2002–2005 Rickard Andersson
Модифицирован PunBB.ru
А находится на jimm.net.ru