GRIG
Новичок
Привет всем. Помогите разобраться с такой проблемой.
Мне нужно:
1) Открыть сокет
2) Выплюнуть в него некоторое сообщение
3) Дождаться ответа на него
4) Выплюнуть в сокет второе сообщение
5) Дождаться ответа на него
6) Закрыть сокет.
Пункты 1+2+4+6 проблем не вызывают:
Проблемы возникают в п.3 и 5. Непонятно как организовать ожидание ответа. А организовать его нужно обязательно - если я закрою связь раньше, чем на том конце закончится обработка моего сообщения, то сообщение вообще не будет обработано. (Да и плюс к тому в будущем может понадобиться обработка этого ответа).
Вставить между двумя записями в сокет вызов функции fgets() - не вариант. Во-первых, потому что в ответе где-то в середине может совершенно законно встретиться символ перевода строки. Во-вторых, потому, что в конце ответа обязательно стоит байт с другим кодом.
Вставить туда вызов fread() - тоже не вариант. Размер ответа заранее неизвестен, и к тому же вместе с ответом не передается. Так что функция будет ждать либо заполнения блока до запрошенного размера, либо закрытия связи.
Проверять условие feof() - еще хуже. Пока связь не закрыта эта функция не вернет true и может даже зависнуть.
В общем, чего-то я тут застрял и ничего путного придумать не могу.
Мне нужно:
1) Открыть сокет
2) Выплюнуть в него некоторое сообщение
3) Дождаться ответа на него
4) Выплюнуть в сокет второе сообщение
5) Дождаться ответа на него
6) Закрыть сокет.
Пункты 1+2+4+6 проблем не вызывают:
PHP:
if( $sock = fsockopen( $ip_adress, $port, $errno, $errstr )
{
fwrite( $sock, $message1 );
fwrite( $sock, $message2 );
fclose( $sock);
}
Вставить между двумя записями в сокет вызов функции fgets() - не вариант. Во-первых, потому что в ответе где-то в середине может совершенно законно встретиться символ перевода строки. Во-вторых, потому, что в конце ответа обязательно стоит байт с другим кодом.
Вставить туда вызов fread() - тоже не вариант. Размер ответа заранее неизвестен, и к тому же вместе с ответом не передается. Так что функция будет ждать либо заполнения блока до запрошенного размера, либо закрытия связи.
Проверять условие feof() - еще хуже. Пока связь не закрыта эта функция не вернет true и может даже зависнуть.
В общем, чего-то я тут застрял и ничего путного придумать не могу.