Запись в socket (fwrite)

mak_sim2001

Новичок
Запись в socket (fwrite)

Можно узнать разорвал ли удалённый сокет соеденеие?
Например:
irc bot:
PHP:
$fp = fsockopen($ircserver,$ircport,$errno,$errstr,30);
if (!fp) {
        echo "$errstr ($errno)<br />\n";
        exit;
} else {
       do {
              ...
              if( fwrite($fp, $message) === FALSE ) {
              // Если IRC разрывает связь то на этой строчке бот умирает не выдавая никаких сообщени.
                     break;
              } else {
              ...
       } while (true)
       fclose($fp)
}
 

Anarki

Новичок
PHP:
ini_set('display_errors',1);
error_reporting(E_ALL);
PHP:
if (fwrite($fp, $message) == false) {
Если ты конечно не собираешься ноль байтов отсылать.

-~{}~ 20.08.08 01:02:

И что значит "умирает"?
 

mak_sim2001

Новичок
Anarki

ini_set('display_errors',1);
error_reporting(E_ALL);
set_time_limit(0);

начало моего скрипта.

Суть не в отображении ошибки, суть в том как выловить это чтобы бот если не может зделать запись в socket выполнял условие else (в моём примере), а так как я понимаю он бесокнечно пытается сделать запись.
Точнее суть в том как узнать что удалённый сокет тебя отключил.
 

Anarki

Новичок
Суть не в отображении ошибки, суть в том как выловить это чтобы бот если не может зделать запись в socket выполнял условие else (в моём примере), а так как я понимаю он бесокнечно пытается сделать запись.
mak_sim2001
Читать умеешь до конца? Измени === на ==.

-~{}~ 21.08.08 02:08:

А вообще нужно отвечать на пинги от ирц сервера, чтобы он соединения не закрывал.
 

mak_sim2001

Новичок
Anarki
на пинги я отвечаю Ж) Даже отлавливаю сообщения с ERROR от IRC. Но для надёжности...
решил попробывать с помощью exec(ps $pid) отловить дисконект на порт 6669 в моём случае.
По поводу ошибки: Есть notice: если сокет неблокирован что то типа "24 byte send error, errno 100034 " (текст не точный) но break не происходит.
Может можно как-то это errno отловить?

-~{}~ 20.08.08 23:31:

p.s. кроме error_get_last();

-~{}~ 20.08.08 23:32:

cDLEON
Оно не от break умирает оно в смысле пытается продолжать работать
 

dimagolov

Новичок
Оно не от break умирает оно в смысле пытается продолжать работать
с чего ты взял? вроде как ман однозначно говорит
fwrite() returns the number of bytes written, or FALSE on error.
то есть твой
PHP:
fwrite($fp, $message) === FALSE
как раз в случае ошибки истина и после этого исполняется блок, в конце которого break;
 

mak_sim2001

Новичок
dimagolov
Точный текст notice:
Notice: fwrite() [function.fwrite]: send of 24 bytes failed with errno=10053
И цикл продолжается.

Можно ли узнать значение errno в скрипте???

-~{}~ 21.08.08 01:22:

Anarki
ПРАВ!!!
Таки да, fwrite в данном случае возвращает 0 (0 байт отправлено) а не false
Т.е. для fwrite ошибки нет.

-~{}~ 21.08.08 01:23:

fwrite() returns the number of bytes written, or FALSE on error.
Я тоже думал должно вернуть false
 
Сверху