Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

не пойму в чем ошибка

86K
01 февраля 2013 года
novic
7 / / 01.02.2013
Такой тест - есть устройства(дслам), зайти телнетом, и командой display... считать инфу по настройкам платы, портов.
Записать в базу результаты. Желательно опрашивать несколько десламов одновременно. -
Решила попробовать через сокеты, но получаю ерунду какую-то. Где ошибка? Использовала как основу скрипт с сайта
http://job-interview.ru/articles/post/194
Скрипт:

<?
Код:
<?
//получить содержимое
$urls = array($ip1, $ip2);

$rtasks = array(); // задачи чтения
$wtasks = array(); // задачи записи
$results = array(); // результаты

foreach ($urls as $url) {
    // открываем отдельный сокет
    $sh = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
    if (!$sh) continue;
 
    // таймаут для чтения
    socket_set_option($sh, SOL_SOCKET, SO_RCVTIMEO, array("sec" => 10, "usec" => 0));
    // таймаут для записи
    socket_set_option($sh, SOL_SOCKET, SO_SNDTIMEO, array("sec" => 10, "usec" => 0));
    // задаем неблокирующий режим сокетов
    socket_set_nonblock($sh);
    // соединяемся через telnet-порт
    socket_connect($sh, $url, 23);
    // добавляем в задачи для записи
    $wtasks[$url] = $sh;
}
 
// продолжаем, пока есть задачи для записи или чтения
while ($wtasks || $rtasks) {
    // массив для сокетов с возможностью чтения
    $rtasks_ = $rtasks;
    // массив для сокетов с возможностью записи
    $wtasks_ = $wtasks;
 
    // ждем результатов из сокетов
    $n = socket_select($rtasks_, $wtasks_, $e=null, 10);
    if ($n > 0) {
        // сокеты, доступные для записи
        foreach ($wtasks_ as $sh) {
            // ищем урл страницы по дескриптору сокета в массиве задач записи
            $url = array_search($sh, $wtasks);
            // удаляем из задач записи
            unset($wtasks[$url]);
            // добавляем в задачи чтения
            $rtasks[$url] = $sh;
            // формируем задание

                        $per  =$login."\r\n";
                        $per .=$password."\r\n";
                        $per .="enable\r\n";
                        $per .="display vlan all\r\n";
                        $per .="\r\n";  
 
            // записываем в сокет
            if (socket_write($sh, $per) === false) fclose($sh);
        }
 
        // сокеты, доступные для чтения
        foreach ($rtasks_ as $sh) {
            // ищем урл страницы по дескриптору сокета в массиве задач чтения
            $url = array_search($sh, $rtasks);
            if (!$url) continue;
            // считываем результат из сокета
            $result = '';
            while ($r = socket_read($sh, 1024)) $result .= $r;
            // закрываем сокет
            socket_close($sh);
            // удаляем из задач чтения
            unset($rtasks[$url]);
            // заносим html в массив результатов
            $results[$url] = $result;
        }
    }
    else {
        break;
    }
 }
//получаю следующее
Warning: socket_connect() [function.socket-connect]: unable to connect [0]: Операция на незаблокированном сокете не может быть завершена немедленно. in C:\www\project\dslamopros0.php on line 30

Warning: socket_connect() [function.socket-connect]: unable to connect [0]: Операция на незаблокированном сокете не может быть завершена немедленно. in C:\www\project\dslamopros0.php on line 30
Array ( [$ip] => яыяы )

автор статьи пишет, что несмотря на выдаваемую ошибку все работает
443
01 февраля 2013 года
REmindER
292 / / 23.03.2003
Какую ерунду?

PHP Manual:

Цитата:

Note:

If the socket is non-blocking then this function returns FALSE with an error Operation now in progress.



Короче говоря, попытка соединения в неблокирующим режиме не дает однозначного результата об успехе соединения, о чем, собственно, и написано. Сокет надо переключать после соединения, а проще просто писать @socket_connect. Кроме того, в этой статье в комментариях приводятся жалобы на постоянные проблемы с получением неполного содержимого страниц, приводятся советы автора по введению паузы в цикл чтения, однако этот эффект является всего лишь проявлением ошибки 10035, которая является всего лишь некоторым уведомлением о невозможности немедленного завершения операции чтения (актуально именно для неблокирующих сокетов).

MSDN:

Цитата:
WSAEWOULDBLOCK Resource temporarily unavailable. This error is returned from operations on nonblocking sockets that cannot be completed immediately, for example recv when no data is queued to be read from the socket. It is a nonfatal error, and the operation should be retried later. It is normal for WSAEWOULDBLOCK to be reported as the result from calling connect (Windows Sockets) on a nonblocking SOCK_STREAM socket, since some time must elapse for the connection to be established.



При неудачной опреции чтения ($res === false) надо проверять номер последней ошибки функцией socket_last_error и не закрывать сокет в случае ошибки 10035.

366
04 февраля 2013 года
int
668 / / 30.03.2005
А если попробовать через fsock_open?
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог