За последние 24 часа нас посетили 53969 программистов и 1718 роботов. Сейчас ищут 1119 программистов ...

по работе с сокетами

Тема в разделе "Прочие вопросы по PHP", создана пользователем enigman, 28 мар 2007.

  1. enigman

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

    С нами с:
    28 мар 2007
    Сообщения:
    3
    Симпатии:
    0
    есть у меня кусок кода с использованием неблокирующего сокета :(схематически)

    PHP:
    1. <?
    2. $ip = '212.45.19.24';
    3. $port = '80';
    4. $query = 'POST example.com/hehe....... HTTP 1/1.........';
    5.  
    6. $sock = socket_create(AF_INET, SOCK_STREAM, 0);
    7. @socket_connect($socket1,"$ip", $ip);
    8. while( !(socket_select($r,$w,$e=null, 0)>0)){ ## {.....}  тут проверяю законектился ли
    9. ussleep(100);
    10. }
    11. ## посылка данных
    12.  
    13.       if ($l=socket_write($sock, $query)===len($query)){
    14.         // {успушный выход}
    15.    }
    16.  
    17. ?>
    получается что в строке №15 {успушный выход} данные отправились, но на самом деле они не дошли до места назначения куда был передан post запрос, в чем может быть дело. Думал прокси, попробовал выполнить тоже самое через браузер всё получается, прокси рабочий. В чем может быть причина ?
    [/code]
     
  2. ONK

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

    С нами с:
    4 фев 2006
    Сообщения:
    281
    Симпатии:
    0
    Адрес:
    СПб
    А как вы проверяете, дошли ли данные до сервера? Я не вижу попыток чтения ответа, да и сам POST пакет весьма символически обозначен. Потом, кто же так проверяет установку соединения? Зачем в примере 8 строка? Откуда берутся $r,$w в 9-й строке? вобщем учитесь писать рабочие демонстрационные скрипты.
     
  3. enigman

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

    С нами с:
    28 мар 2007
    Сообщения:
    3
    Симпатии:
    0
    Я дико извиняюсь за некоректный пример, написан он на обум, из исходника тяжело выдрать рабочий код да и время жмет сильно :), человеку "понимающему" общий принцип понятен, здесь проблема в том, что я не знаю как получить результат от сервера о принятии данных, т.е. для себя я результатом записи на сервер считал условие
    PHP:
    1.  <?if ($l=socket_write($sock, $query)===len($query)){
    2.      ## думаю что все записалось
    3.    }?>
    т.е. что длинна записанных данных в сокет, равна длинне самих переданных данных, но как я убедился на примере работы с прокси этого недостаточно. Подскажите пожалуйста как правильнее получить информацию о принятии данных от сервера ?
    Что самое интересное без использования прокси всё отлично работает.
     
  4. ONK

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

    С нами с:
    4 фев 2006
    Сообщения:
    281
    Симпатии:
    0
    Адрес:
    СПб
    enigman, количество успешно записанных байт вовсе может не означать успешность передачи запроса. HTTP высокоуровневый протокол обмена данными, в данном случае работающий поверх TCP протокола. Чтобы убедиться, что запрос обработан, надо дождаться ответа HTTP протокола. Предположительно это будет что то типа HTTP/1.0(1) 200 OK.

    Для получения ответа надо дождаться появления в буфере чтения данных (с помощью socket_select), считать их с помощью socket_read и распарсить полученные данные с целью извлечения полезной информации.

    Удачи! -)