Помогите с socket (MMP)

Статус
В этой теме нельзя размещать новые ответы.

Dador

Читатель
Заблокирован
Регистрация
14 Янв 2008
Сообщения
368
Реакции
100
  • Автор темы
  • Заблокирован
  • #1
Пытаюсь написать класс для протокола MMP Это тот что от агента:
так вот пытаюсь так
PHP:
class Mra {
    function prepare($body)
    {
        $this->sequence++;
        $out = pack('V', strlen($body)).pack('a',$this->body);
        return $out;
    }
	function open($url = array('94.100.181.63', 2041)) {
        $this->socet = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
        if ($this->socet < 0 || $this->socet === false) {
            $this->error = "socket_create() failed: reason: " . socket_strerror($this->socet);
            return false;
        }
        $result = socket_connect($this->socet, $url[0], $url[1]);
        if ($result < 0 || $result === false) {
            $this->error = "socket_connect() failed.\nReason: ($result) " . socket_strerror(socket_last_error($socket));
            return false;
        }
        return true;
	}
	function write($pack) {
		$pack=$this->prepare($pack);
		socket_write($this->socet, $pack, strlen($pack));
	}
	function read() {
		return socket_read($this->socet,1024,PHP_BINARY_READ);
	}
}
(знаю что гавна в коде много, всё же тестирую)
и
PHP:
$mra=new Mra;
$mra->open();
echo 'Открыто соединение<br>';
$mra->write('MRIM_CS_HELLO');
echo 'Отправили команду<br>';
echo $mra->read();

Но вот зависает на read - т.е. не отвечает :(
вроде подал ему всё как надо(хотя не уверен), на сайте написано
MMP бинарный протокол. Все числовые данные передаются как четырехбайтные целые НЕ в сетевом формате, т. е. первым идет старший байт, последним младший. Четырехбайтовые беззнаковые целые обозначаются UL.

Текстовые данные передаются с префексированной длиной, т. е. сначала UL, а потом строка (в кодировке windows-1251) длины UL без завершающего нуля. Обозначение в дальнейшем - LPS.


помогите, в чем проблема, из за чего не отвечает
должен прийти ответ:
После установки tcp-соединения клиент обязан сразу послать MRIM_CS_HELLO, дождаться MRIM_CS_HELLO_ACK, после чего


я думаю, что скорее всего я не правильно делаю pack()
 
MRIM_CS_HELLO это только условное имя
#define MRIM_CS_HELLO 0x1001
то есть посылать надо 0x1001
 
MRIM_CS_HELLO это не текстовые данные, поэтому не нужно передавать длинну, надо передать просто число
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху