[C#] Работа с MRIM(MMP)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Niades, 25 Sep 2011.

  1. Niades

    Niades New Member

    Joined:
    30 Nov 2010
    Messages:
    28
    Likes Received:
    3
    Reputations:
    0
    Здравствуйте!
    Пишу программу для работы с протоколом MRIM (Mail.Ru Agent).
    Использую класс TcpClient для отправки\получения данных (если быть точней - сокет TcpClient.Client). Отправляю MRIM_CS_HELLO, сервер отвечает MRIM_CS_HELLO_ACK, отправляю MRIM_CS_PING, сразу же за ним MRIM_CS_LOGIN2, ответа от сервера нет никакого вообще. Код:
    PHP:

    <...>
                
    SendData(CreateMrimPacket(MRIM_CS_HELLO));
                
    byte[] dat= new byte[48];
                
    ReceiveData(ref dat);
                
    MrimPacket ans DecodeMrimPacket(dat);
                if (
    ans.msg == MRIM_CS_HELLO_ACK)
                {
                    
    SendData(CreateMrimPacket(MRIM_CS_PING));
                    
    SendData(CreateMrimPacket(MRIM_CS_LOGIN2Combine(LPS("[email protected]"),LPS("password"),UL(0x00000001))));
                    
    byte[] data = new byte[48];
                    
    MainSocket.Receive(data);
                    
    ans DecodeMrimPacket(data);
                    if (
    ans.msg == MRIM_CS_LOGIN_ACK)
                        
    MessageBox.Show("AUTHOK");
                }
    <...>

            private 
    void ReceiveData(ref byte[] data)
            {
                
    MainSocket.Receive(data);
            }

            private 
    void SendData(byte[] data)
            {
                
    MainSocket.Send(data);
            }

    Абсолютно уверен, что проблема именно в коде, потому что если я отправлю MRIM_CS_HELLO еще раз - ответа так же не последует. Тут даже дело не в протоколе, а в работе с сокетами.
    Очень прошу помочь разобратся с этим всем.
    Заранее спасибо
     
    #1 Niades, 25 Sep 2011
    Last edited: 25 Sep 2011
  2. Kaimi

    Kaimi Well-Known Member

    Joined:
    23 Aug 2007
    Messages:
    1,732
    Likes Received:
    811
    Reputations:
    231
    Сокет перевел в неблокирующий режим?
     
    _________________________
  3. Niades

    Niades New Member

    Joined:
    30 Nov 2010
    Messages:
    28
    Likes Received:
    3
    Reputations:
    0
    Когда перевожу в неблокирующий вылетает экспепшен:
    на строчке MainSocket.Receive();
    Может я чего-то не понимаю, но причем тут вообще блокирующий\неблокирующий режим?
    Я наверное не слишком верно обозначил проблему. После отправки второго пакета, и вызове Socket.Receive() проходит около минуты, затем код продолжает выполнятся, причем массив переданный в Socket.Receive() как был из нулей, так и остался.
    Вообще у меня еще была идея отказаться от TCPClient'a и переписать на Socket'ы полностью, но в таком случае ответ от сервера вообще не удалось получить (SocketType.Raw и ProtocolType.Unspecified)
     
    #3 Niades, 25 Sep 2011
    Last edited: 25 Sep 2011
  4. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    Какую версию протокола ты используешь?
    Читай мой блог - а так же просмотри мои темы здесь. Я написал не один клиент ) проблем не возникнет, если умеешь пользоваться сниффером и знаешь основы сетевого программирования.
     
    _________________________
  5. Niades

    Niades New Member

    Joined:
    30 Nov 2010
    Messages:
    28
    Likes Received:
    3
    Reputations:
    0
    За ссылку на блог спасибо.
    Со сниффером проблемы, потому что единственно возможный способ выхода в сеть - 3G модем, просниффать который мне не удалось, посему приходится пользоватся официальным описанием протокола ( http://agent.mail.ru/ru/developers/protocol.html ).
     
  6. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    Официальный описание - давно устарело.
    Сейчас даже порядок установления соединения другой. Но пока не запрещено использовать протокол от 5,7 версии агента - там еще не было шифрования :) Пакет авторизации описан в блоге + дан пример клиента.

    Есть конечно кросс платформенный каркас клиента на Си поддерживающий одновременно N-ое количество аккаунтов, но он для частного использования :)
     
    _________________________
    #6 Gar|k, 26 Sep 2011
    Last edited: 26 Sep 2011