За последние 24 часа нас посетили 18268 программистов и 1637 роботов. Сейчас ищут 1576 программистов ...

Реализация Extensible Provisioning Protocol

Тема в разделе "Решения, алгоритмы", создана пользователем DZEN, 15 мар 2012.

  1. DZEN

    DZEN Активный пользователь

    С нами с:
    10 сен 2007
    Сообщения:
    250
    Симпатии:
    0
    Потребовалась реализация, но найти хоть одну работающую библиотеку не удалось. Все работающие работают только со своими серверами. Куда обращаться уже не знаю, уже свой велосипед согласен написать.
     
  2. AndreJM

    AndreJM Активный пользователь

    С нами с:
    25 янв 2012
    Сообщения:
    522
    Симпатии:
    0
    А с каким тебе надо?
    И да, SOAP и прочая майл-лабуда уже не модно? На крайняк stream_socket_client.
     
  3. DZEN

    DZEN Активный пользователь

    С нами с:
    10 сен 2007
    Сообщения:
    250
    Симпатии:
    0
    SOAP - модно, но только как его прикрутить я и спрашиваю. Вот неработающий, так как ошибки не выдаёт, но все ответы пустые (закрыто по ip, поэтому только почитать что я не так делаю).
    Код (Text):
    1. <?php
    2. $fp = stream_socket_client("epp.hostmaster.ua:700", $errno, $errstr, 5);
    3. if (!$fp)
    4. {
    5.     echo $errstr.'('.$errno.')';
    6. }
    7. else
    8. {
    9.     echo 'Приветствие:'.fread($fp, 1024);
    10. }
     
  4. AndreJM

    AndreJM Активный пользователь

    С нами с:
    25 янв 2012
    Сообщения:
    522
    Симпатии:
    0
    Не стоит забывать, что так или иначе но это протокол, а значит есть и header, а он, насколько мне известно примерно 4 байта и содержит длину фрейма. Задача распаковать заголовк, получить длину фрейма и собственно считать данные. При передаче все тоже самое.

    Относительно SOAP читаем тут http://www.php.ru/manual/book.soap.html

    И главное усвойте, что данные передают/получают в формате XML. Читайте спецификацию протокола EPP

    Добавлено спустя 1 минуту 0 секунд :
    И да, тут следует указать протокол, вроде как EPP поверх TCP, значит либо tcp:// либо tls:// (SSL)
     
  5. DZEN

    DZEN Активный пользователь

    С нами с:
    10 сен 2007
    Сообщения:
    250
    Симпатии:
    0
    Спасибо, всё смог разобрать без SOAP, ибо на сервере его нет, но его включение дело на пару дней :).
    XML уже парсится, всё работает, мне такое не впервой, но...
    Считал я
    Код (Text):
    1. fread($this->fp, 4)
    к примеру, и как мне его распоковать?
     
  6. AndreJM

    AndreJM Активный пользователь

    С нами с:
    25 янв 2012
    Сообщения:
    522
    Симпатии:
    0
    Ну как вариант так:
    Код (PHP):
    1. list(,$length) = unpack('N', fread($this->fp,4));
    2. // ну а дальше
    3. $frame = fread($this->fp, ($length-4));
    4.  
     
  7. DZEN

    DZEN Активный пользователь

    С нами с:
    10 сен 2007
    Сообщения:
    250
    Симпатии:
    0
    Про
    именно с n искал бы ещё тысячилетие. Премного благодарен *низкий поклон*.
     
  8. AndreJM

    AndreJM Активный пользователь

    С нами с:
    25 янв 2012
    Сообщения:
    522
    Симпатии:
    0
    получилось хоть?
    а 'N' был взят так как логично предположить, что скорее всего длину фрейма хранят в unsigned long (от старшего к младшему), но могу и ошибаться .. вообщем дело тестов
     
  9. DZEN

    DZEN Активный пользователь

    С нами с:
    10 сен 2007
    Сообщения:
    250
    Симпатии:
    0
    Почти. Только отвечает как будто я ничего не слал через fwrite. А так всё тобой предложенное работает.
     
  10. AndreJM

    AndreJM Активный пользователь

    С нами с:
    25 янв 2012
    Сообщения:
    522
    Симпатии:
    0
    а упаковывал перед fwrite?

    Код (Text):
    1.  
    2. fwrite($this->fp, pack('N', strlen($xmlContent)+4).$xmlContent);
    Насчёт русского в XML не забудь, а то и strlen будет корявый =)
     
  11. DZEN

    DZEN Активный пользователь

    С нами с:
    10 сен 2007
    Сообщения:
    250
    Симпатии:
    0
    Там только латиница будет. Сработало без ошибки только на это, но опять таки как будто ничего не слал.
    Код (Text):
    1. fwrite($this->fp, pack('n', strlen($xml)+4).$xml."\n");
    Продолжаю танцевать с бубном.
     
  12. AndreJM

    AndreJM Активный пользователь

    С нами с:
    25 янв 2012
    Сообщения:
    522
    Симпатии:
    0
    Код (Text):
    1.  
    2. "\n"
    Зачем этот неучтённый в заголовке байт? =)

    и не "pack('n' ...", а "pack('N'..."
     
  13. DZEN

    DZEN Активный пользователь

    С нами с:
    10 сен 2007
    Сообщения:
    250
    Симпатии:
    0
    зато работает :)
     
  14. AndreJM

    AndreJM Активный пользователь

    С нами с:
    25 янв 2012
    Сообщения:
    522
    Симпатии:
    0
    c pack разберись, я дописал в пред. сообщении..
     
  15. DZEN

    DZEN Активный пользователь

    С нами с:
    10 сен 2007
    Сообщения:
    250
    Симпатии:
    0
    N поменял, "\n" убрал - тоже работает, но эффекта нет. я в шоке.
     
  16. AndreJM

    AndreJM Активный пользователь

    С нами с:
    25 янв 2012
    Сообщения:
    522
    Симпатии:
    0
    Хмм...
    Что покажет вот эта строка?
    Код (Text):
    1.  
    2. print (PHP_INT_SIZE);
     
  17. DZEN

    DZEN Активный пользователь

    С нами с:
    10 сен 2007
    Сообщения:
    250
    Симпатии:
    0
    8 пишет
    fwrite возвращает 539
     
  18. AndreJM

    AndreJM Активный пользователь

    С нами с:
    25 янв 2012
    Сообщения:
    522
    Симпатии:
    0
    Да, x64 у тебя, в принципе нормуль для 'N'.
    Ну значит осталось теперь смотреть на XML =)
     
  19. DZEN

    DZEN Активный пользователь

    С нами с:
    10 сен 2007
    Сообщения:
    250
    Симпатии:
    0
    XML нормальный, я отлавливаю, что web клиент отсылает. сам пытаюсь тоже самое отослать - фэйл.
     
  20. AndreJM

    AndreJM Активный пользователь

    С нами с:
    25 янв 2012
    Сообщения:
    522
    Симпатии:
    0
  21. DZEN

    DZEN Активный пользователь

    С нами с:
    10 сен 2007
    Сообщения:
    250
    Симпатии:
    0
    Сейчас так. Да и не отвечает он без сертификата вообще.
    Код (Text):
    1.         $context = stream_context_create();
    2.         stream_context_set_option($context, 'ssl', 'local_cert', 'cert.pem');
    3.         stream_context_set_option($context, 'ssl', 'allow_self_signed', true);
    4.         stream_context_set_option($context, 'ssl', 'verify_peer', false);
    5.         $this->fp = stream_socket_client(
    6.             'ssl://'.self::$url.':'.self::$port, $this->errno, $this->errstr,30, STREAM_CLIENT_CONNECT, $context
    7.         );
     
  22. AndreJM

    AndreJM Активный пользователь

    С нами с:
    25 янв 2012
    Сообщения:
    522
    Симпатии:
    0
    Web клиент через какой протокол шлёт?
    Может курлом имеет смысл попробовать?
     
  23. DZEN

    DZEN Активный пользователь

    С нами с:
    10 сен 2007
    Сообщения:
    250
    Симпатии:
    0
    Показывает только то что слал и получил :(.
    Тоже самое.
    http://phpclub.ru/talk/threads/php-xml-epp-сервер.68414/
    Вот ещё один страдалец.
     
  24. AndreJM

    AndreJM Активный пользователь

    С нами с:
    25 янв 2012
    Сообщения:
    522
    Симпатии:
    0
    Чем вытягиваешь? Ну сигнатура пакета должна быть, а иначе чего-то ты там обрезанное тащишь =)
     
  25. DZEN

    DZEN Активный пользователь

    С нами с:
    10 сен 2007
    Сообщения:
    250
    Симпатии:
    0
    Спасибо огромное, что помог разобраться. Остановиться можно было на fwrite($this->fp, pack('N', strlen($xml)+4).$xml); - пересбор php и дефолтовые параметры это сила :-D.