Функции, осуществляющие чтение из блокирующего сокета, ждут, пока в со- кете появятся данные для чтения. Если сокет не блокирующий, эти функции сразу выполняют возврат и сообщают о сбойной ситуации, когда данных нет.
socket_set_timeout()
boolean socket_set_timeout(int socket_descriptor, int seconds, int micros)
Эта функция устанавливает тайм-аут сокета с точностью до микросекунд. Первый аргумент передает дескриптор сокета, второй аргумент задает длительность тайм-аута в секундах, а третий задает составляющую длительности тайм-аута в микросекундах и определяет, как долго сокет может оставаться открытым в отсутствие какого-либо ввода/вывода.
socket_read()
string socket_read(int socket_descriptor, int length [, int type])
С помощью этой функции можно осуществлять чтение из дескриптора соке- та, заданного первым аргументом. Аргумент length указывает, сколько байт надо прочесть.
Необязательный аргумент type может принимать значение PHP_NORMAL_READ или PHP_BINARY_READ. Если указан тип PHP_NORMAL_READ, операция чтения прекращается, как только встретится символ \п (перевод строки) или \г (возврат каретки). Если задан тип PHP_BINARY_READ, операция чтения продолжается, пока не кончатся данные или не будет прочтено указанное количество байт. В версии 4.0.6 отсутствие аргумента type равносильно указанию PHP NORMAL READ. Начиная с РНР4.1.0 аргумент type по умолчанию имеет значение PHP_6INARY_READ. Функция возвращает прочитанные данные или FALSE, если произойдет ошибка.
socket_write()
int socket_write(int socket_descriptor, string &buffer, int length)
Эта функция дополняет функцию socket_read (). Она записывает байты из буфера, заданного вторым аргументом, в дескриптор сокета, заданный в первом аргументе. Третий аргумент устанавливает количество байт, которое должно быть записано. Функция возвращает количество записанных байт или false, если произойдет ошибка.
socket_strerror()
string socket_strerror(int errno)
Номер ошибки, получаемый от функций сокетов, не сильно помогает понять, что произошло. Если передать номер ошибки в качестве аргумента функции socket_strerror(), то последняя возвращает строку со словесным описанием ошибки.
Приложение почтового клиента
В этом разделе мы разработаем приложение, в сущности, почтовый клиент, в котором применим знание API сокетов и механизм разрешения имен DNS. API DNS будет использован для получения информации об адресе почтового сервера, a API сокетов - для открытия соединения с ним и обмена данными с помощью почтового протокола SMTP. Пример преследует чисто иллюстративные цели. Любое реальное приложение должно опираться на Mail API, представляющий собой часть дистрибутива РНР (см. рис. 13.3).