<?php
$socket = stream_socket_server ('tcp://0.0.0.0:2000', $errno, $errstr);
stream_set_blocking($socket, 0);
$base = event_base_new();
$event = event_new();
event_set($event, $socket, EV_READ | EV_PERSIST, 'ev_accept', $base);
event_base_set($event, $base);
event_add($event);
event_base_loop($base);
$GLOBALS['connections'] = array();
$GLOBALS['buffers'] = array();
function ev_accept($socket, $flag, $base) {
static $id = 0;
$connection = stream_socket_accept($socket);
stream_set_blocking($connection, 0);
$id += 1;
$buffer = event_buffer_new($connection, 'ev_read', NULL, 'ev_error', $id);
event_buffer_base_set($buffer, $base);
event_buffer_timeout_set($buffer, 30, 30);
event_buffer_watermark_set($buffer, EV_READ, 0, 0xffffff);
event_buffer_priority_set($buffer, 10);
event_buffer_enable($buffer, EV_READ | EV_PERSIST);
// we need to save both buffer and connection outside
$GLOBALS['connections'][$id] = $connection;
$GLOBALS['buffers'][$id] = $buffer;
}
function ev_error($buffer, $error, $id) {
event_buffer_disable($GLOBALS['buffers'][$id], EV_READ | EV_WRITE);
event_buffer_free($GLOBALS['buffers'][$id]);
fclose($GLOBALS['connections'][$id]);
unset($GLOBALS['buffers'][$id], $GLOBALS['connections'][$id]);
}
function ev_read($buffer, $id) {
while ($read = event_buffer_read($buffer, 256)) {
var_dump($read);
}
}
?>
В ev_read у меня прописан протокол. Создается экземпляр класса, происходит валидация введенных данных. И тут мне нужно отключить клиента от сокета в случае ошибки, но перед этим послать сообщение. Делаю так:
event_buffer_write($buffer, 'ERROR!');
event_buffer_disable($GLOBALS['buffers'][$id], EV_READ | EV_WRITE);
event_buffer_free($GLOBALS['buffers'][$id]);
fclose($GLOBALS['connections'][$id]);
unset($GLOBALS['buffers'][$id], $GLOBALS['connections'][$id]);
Клиент не получает сообщение.
Пробовал usleep в пол секунды (большее время недопустимо)
Все равно не вижу сообщения. Как быть?
Спустя 2 минуты, 21 секунда (24.03.2012 - 10:31) ADiel написал(а):
С обычным сокетом без libevent все нормально писалось, а потом закрывалось соединение. Это особенность стрим сокета или libevent?
Спустя 1 час, 38 минут, 53 секунды (24.03.2012 - 12:10) glock18 написал(а):
Так, ну, рассуждаю как человек ни разу не работавший с libevent.
Пара вопросов:
1. без закрытия сокета сообщение доставляется?
2. попробуй определить из-за какой из функций именно не происходит отправка
event_buffer_disable или event_buffer_free. После этого уже будет ситуация несколько понятней
3. При вызове event_buffer_write данные ждут в буфере, пока возможность такая не появится. первое что приходит в голову для того, чтобы с этим разобраться - повесить закрытие на обработчик при отправке данных (не знаю, есть ли такой)
event_ buffer_ set_ callback
Пара вопросов:
1. без закрытия сокета сообщение доставляется?
2. попробуй определить из-за какой из функций именно не происходит отправка
event_buffer_disable или event_buffer_free. После этого уже будет ситуация несколько понятней
3. При вызове event_buffer_write данные ждут в буфере, пока возможность такая не появится. первое что приходит в голову для того, чтобы с этим разобраться - повесить закрытие на обработчик при отправке данных (не знаю, есть ли такой)
event_ buffer_ set_ callback
Спустя 4 минуты, 15 секунд (24.03.2012 - 12:14) ADiel написал(а):
1. Отправляются
2. Не удалось без event_buffer_free и event_buffer_disable
3. Вот за это спасибо. Попробую
2. Не удалось без event_buffer_free и event_buffer_disable
3. Вот за это спасибо. Попробую
Спустя 7 минут, 27 секунд (24.03.2012 - 12:21) glock18 написал(а):
Цитата (ADiel @ 24.03.2012 - 09:14) |
2. Не удалось без event_buffer_free и event_buffer_disable |
а с каждый по отдельности то как?
Спустя 8 минут, 27 секунд (24.03.2012 - 12:30) ADiel написал(а):
Теперь я рассудил как человек, не совсем понимающий как работает libevent:)
Т.к. данные ждут в буффере, я решил его исключить.
stream_socket_sendto($GLOBALS['connections'][$id], 'ERROR');
//event_buffer_write($buffer, 'ERROR');
Теперь сначала я получаю сообщение, а потом отключается сокет
glock18, спасибо.
Т.к. данные ждут в буффере, я решил его исключить.
stream_socket_sendto($GLOBALS['connections'][$id], 'ERROR');
//event_buffer_write($buffer, 'ERROR');
Теперь сначала я получаю сообщение, а потом отключается сокет

glock18, спасибо.
Спустя 14 минут, 39 секунд (24.03.2012 - 12:44) glock18 написал(а):
Цитата (ADiel @ 24.03.2012 - 09:30) |
Теперь сначала я получаю сообщение, а потом отключается сокет glock18, спасибо. |
Сообразительному человеку подсказать всегда пожалуйста

Спустя 27 минут, 57 секунд (24.03.2012 - 13:12) ADiel написал(а):

_____________
Ищи меня тут (ilyaplot)