Шрифт:
Сокеты TCP и UDP являются двусторонними. Стандартные потоки ввода- вывода также могут быть двусторонними: мы просто открываем поток типа
Простейший способ обработки подобной проблемы чтения-записи — это открытие двух стандартных потоков ввода-вывода для данного сокета: одного для чтения и другого для записи.
Пример: функция str_echo, использующая стандартный ввод-вывод
Сейчас мы модифицируем наш эхо-сервер TCP (см. листинг 5.2) для использования стандартного ввода-вывода вместо функций
Листинг 14.6. Функция str_echo, переписанная с использованием стандартного ввода-вывода
Если мы запустим наш сервер с этой версией функции
Здесь возникает проблема буферизации, поскольку сервер ничего не отражает, пока мы не введем наш символ конца файла. Выполняются следующие шаги:
Мы набираем первую строку ввода, и она отправляется серверу.
Сервер читает строку с помощью функции
Но стандартный поток ввода-вывода сервера полностью буферизованстандартной библиотекой ввода-вывода. Это значит, что библиотека копирует отраженную строку в свой стандартный буфер ввода-вывода для этого потока, но не выдает содержимое буфера в дескриптор, поскольку буфер не заполнен.
Мы набираем вторую строку ввода, и она отправляется серверу.
Сервер читает строку с помощью функции
Снова стандартная библиотека ввода-вывода сервера только копирует строку в свой буфер, но не выдает содержимое буфера в дескриптор, поскольку он не заполнен.
По тому же сценарию вводится третья строка.
Мы набираем наш символ конца файла, и функция