Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проверка сокетов. 
:(
    Опции темы
BuShaRt
Дата 2.6.2007, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1391
Регистрация: 29.6.2006

Репутация: 4
Всего: 6



Задача - организовать провеку сокета на работоспособность т.е. идет ли к нему подключение и передача данных, для проверки автообновления.
Код

<?php
$damp = explode("\n" , $_POST['damp']);
foreach ($damp as $val) {
    $val  = explode(":" , $val);
    $port = trim($val[1]); 
    $ip   = trim($val[0]); 
    $fp   = fsockopen("udp://".$ip , $port, $errno, $errstr, 30);
    if (!$fp) {
        print 'Unable to open '.$ip.':'.$port.'<br>';
        continue;
    }
    fwrite($fp, "GET / HTTP/1.0\r\n\r\n");
    stream_set_timeout($fp, 1);
    fread($fp, 1);
    $info = stream_get_meta_data($fp);
    fclose($fp);    
    if (!$info['timed_out']) {
        print '<font color="#009900">'.$ip.':'.$port.' - Work</font><br>';
    } else {
        print '<font color="#FF0033">'.$ip.':'.$port.' - NO work</font><br>';
    }
}
?> 

Организовал так, в целом вроде все работает, но проскакивают и не рабочие варианты, в чем проблема и как следует дополнить код?
PM MAIL   Вверх
BuShaRt
Дата 3.6.2007, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1391
Регистрация: 29.6.2006

Репутация: 4
Всего: 6



Странно, не кто не знает решения данной задачи? :(
не верю...
PM MAIL   Вверх
WolfON
Дата 3.6.2007, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 604
Регистрация: 19.7.2004

Репутация: 6
Всего: 8



По тому, что не правильно сформирован вопрос.

Что за сокет?
Из кода я вижу, что udp, причем на нем висит какой-то http-сервер.

А в чем проблема?
В том, что часто пишет нерабочие хосты или рабочие пишет в сломанные?
Если первое, то тут просто может быть закрыт доступ на листинг / директории
PM MAIL ICQ   Вверх
BuShaRt
Дата 3.6.2007, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1391
Регистрация: 29.6.2006

Репутация: 4
Всего: 6



Цитата(WolfON @  3.6.2007,  13:18 Найти цитируемый пост)
Что за сокет?

Хотелось бы чтоб проверка была универсальной и не ужели это важно, что висит на данном сокете?

Цитата(WolfON @  3.6.2007,  13:18 Найти цитируемый пост)
В том, что часто пишет нерабочие хосты или рабочие пишет в сломанные?

Пропускает с ярлыком "work" нерабочие иногда.

Цитата(WolfON @  3.6.2007,  13:18 Найти цитируемый пост)
Если первое, то тут просто может быть закрыт доступ на листинг / директории

Хм, а как сокеты с этим связанны?


Это сообщение отредактировал(а) BuShaRt - 3.6.2007, 13:38
PM MAIL   Вверх
WolfON
Дата 3.6.2007, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 604
Регистрация: 19.7.2004

Репутация: 6
Всего: 8



BuShaRt, связанно именно тем, что вы шлете <b>HTTP</b>-заголовок
Код

fwrite($fp, "GET / HTTP/1.0\r\n\r\n");


Если это http-прокси или http-сервер, то вроде все будет и не очень плохо, но в случае с проксей не обязательно заработает

Потом лучше использовать проверку с типом, те !== на то, что произошел таймаут ну и вконце-концов может не пускать на сокет не только из-за таймаута
PM MAIL ICQ   Вверх
BuShaRt
Дата 3.6.2007, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1391
Регистрация: 29.6.2006

Репутация: 4
Всего: 6



Цитата(WolfON @  3.6.2007,  14:26 Найти цитируемый пост)
связанно именно тем, что вы шлете <b>HTTP</b>-заголовок

smile
Это потому, что я собиралс скрипт из примеров, по суте не очень хорошо разбираясь в сокетах.

Я думаю, тогда стоит отбросить код, представленный мной... 

Вы не могли бы рассказать, оптимальный алгоритм проверки сокетов? (можно и без примера на PHP). Пока перепишу, хоть подробние в сокетах рабзерусь.
PM MAIL   Вверх
BuShaRt
Дата 3.6.2007, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1391
Регистрация: 29.6.2006

Репутация: 4
Всего: 6



Я опять не точно выразил мысль?
PM MAIL   Вверх
CyClon
Дата 3.6.2007, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 3.12.2005

Репутация: 3
Всего: 4



Код
fsockopen("udp://".$ip , $port, $errno, $errstr, 30);


Возможно я ошибаюсь, но протокол в имени хоста никогда не указывался и не указывается. На это есть порт.


--------------------
user posted image
PM   Вверх
CyClon
Дата 3.6.2007, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 3.12.2005

Репутация: 3
Всего: 4



Код
<?php

$_POST['list'] = "ya.ru:80\ngoogle.com:80\nclon.mediazona:21";

$list = explode("\n", $_POST['list']);

foreach ($list as $url) {
    $ok = 1;
    list($host, $port) = explode(':', $url);
    if ($fp = fsockopen($host, $port, $errno, $errstr, 10)) {
        switch ($port) {
            case 80:
                $headers[] = 'GET / HTTP 1.0';
                $headers[] = 'Host: ' . $host;
                fputs($fp, implode("\r\n", $headers) . "\r\n\r\n");
                while (!feof($fp)) {
                    $buffer[] = fread($fp, 1024);
                }
                if (strpos(implode('', $buffer), '200 OK') === false) {
                    $ok = 0;
                }
                break;
        }
    } else {
        $ok = 0;
    }

    echo $host . ': ' . (($ok) ? 'OK' : 'BAD') . PHP_EOL;
}

?>


Мб нечто этого, а то что ты написал - фигня помоему. Если хост отвечает, он и так вернет какой-нибудь ответ, соответственно в твоем случае можно кром проверки коннекта ничего не делать. В моем скрипте нужно прописать тест для разных портов, для 80 я сам написал smile Ты допиши и будет тебе универсальность.


--------------------
user posted image
PM   Вверх
BuShaRt
Дата 3.6.2007, 22:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1391
Регистрация: 29.6.2006

Репутация: 4
Всего: 6



CyClon
у, как все сложно... А где то может есть, где почитать про разные порты? Их ведь по моему куча разных :(
PM MAIL   Вверх
WolfON
Дата 4.6.2007, 00:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 604
Регистрация: 19.7.2004

Репутация: 6
Всего: 8



Сколько портов, столько и протоколов, если не больше smile
Читай RFC.
http://www.rfc-editor.org/

В самом общем случае достаточно просто попробовать с определенным портом соединиться - те проверить открыт он или нет. А проверка на работоспособность каждого сервиса висящего на порту - это занятие утомительное и бессмысленное. Лучше запрограммировать нужные для проверки сервисы и если очень хочется сделать систему плагинов (допустим xml-описание действий нужных для проверки работоспособности протокола), чтобы быстро добавлять для проверки новые порты.
PM MAIL ICQ   Вверх
BuShaRt
Дата 4.6.2007, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1391
Регистрация: 29.6.2006

Репутация: 4
Всего: 6



А на сколько логично будет, попробывать записать данные на порт, потом считать эти данные и если получилось объявить порт рабочим?

Добавлено через 1 минуту и 26 секунд
 smile Извеняюсь за такую дотошность, просто диплом висит, плюс заказчик вот объявил, что данный модуль оказался не рабочим, мол пре тестирование просто повезло. А деньги уже заплатили, но одновременно с дипломом завал :( 
PM MAIL   Вверх
WolfON
Дата 4.6.2007, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 604
Регистрация: 19.7.2004

Репутация: 6
Всего: 8



BuShaRt, обычно используются комманды типа HELO или какая-то последовательность байтов для кажого протокола, чтобы определить, что это он, по этому писать ахинею не катит
PM MAIL ICQ   Вверх
BuShaRt
Дата 4.6.2007, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1391
Регистрация: 29.6.2006

Репутация: 4
Всего: 6



WolfON
Получаеться, чтоб написать универсальный чикед, нужно организоваться не одну сотную строк кода? и задача достаточно кропотливая?
PM MAIL   Вверх
WolfON
Дата 4.6.2007, 23:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 604
Регистрация: 19.7.2004

Репутация: 6
Всего: 8



BuShaRt, более чем много, но как правило достаточно проверить порт на то открыт он или нет и свериться по базе портов к какому он сервису пренадлежит
PM MAIL ICQ   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1022 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.