Работа с сокетами. Одновременно и слушать и записывать. Возможно?

W100

Новичок
Работа с сокетами. Одновременно и слушать и записывать. Возможно?

Добрый день!

Вопрос возник по поводу использованию сокетов, при разработке tcp/ip демона, с которым общение будет через telnet. Все реализовано на php. Запускается через крон и ждет на определенном порту.

Задача в том, чтобы переодически сервер скидывал определенные команды, а переодически клиент на них либо отвечает, либо скидывает свои.

Всё работает, за исключением того, что если сделать
$input = socket_read($client[$i]['sock'],1024);

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

Вопрос в следующем, как одновременно и слушать ответы клиента и свои команды посылать можно?

Спасибо.
 

W100

Новичок
$sock = socket_create(AF_INET, SOCK_STREAM, 0);

$ready = socket_select($read,$write,$e=null,null);
 

W100

Новичок
да, вижу интересные функции, но есть ли кусок кода для большего понимания? ведь в любом случае при socket_read скрипт ждёт пока не появятся данные
 

W100

Новичок
Вообще работа с блокирующими и неблокирующими сокетами различается?

Начинаем как я понимаю с создания сокета:

$max_clients = 10;
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_nonblock ($socket);
socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);
socket_bind($socket, '192.168.1.2', 12000);
socket_listen($socket, $max_clients);

дальше надо выбрать нужный сокет

$ready = socket_select($read, $write = NULL, $except = NULL, $tv_sec = NULL);

далее для всех подключившихся в цикле делаем

$clients[$i]['socket'] = socket_accept($socket);

потом в цикле делаю
$data = @socket_read($clients[$i]['socket'], 1024, PHP_NORMAL_READ);

и скрипт всё равно висит и ждёт пока не придут данные...

в чём проблема?
 

W100

Новичок
rotoZOOM

предполагается что я создал неблокирующий сокет
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_nonblock ($socket);
 

W100

Новичок
rotoZOOM

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

-~{}~ 23.12.08 12:37:

Wicked

tv_sec это параметр, как долго сокет будет ждать ответа в секундах, т.е. нужно поставить пару секнунд? правильно я понимаю?
 

rotoZOOM

ACM maniac
W100 Я тебя просто спрашиваю, тот сокет ИЗ которого ты читаешь и НА котором блокируется socket_read в каком режиме? Nonblocking?
 

rotoZOOM

ACM maniac
W100 Обманывать не хорошо.
1. Добавь socket_set_nonblock всем клиентским сокетам.
2. Убери PHP_NORMAL_READ из чтения.
 

W100

Новичок
rotoZOOM
спасибо за наводку... вроде заработало около дела
только теперь вводить разрешает по 1 символу, т.е. не дожидаясь команды ввод, хотя в socket read стоит ожидание 10 секунд
 

rotoZOOM

ACM maniac
W100 Ты определись, что тебе надо? Или висеть на одном клиенте до полного ввода строки или параллельно работать с несколькими в одном потоке?
 
Сверху