Функции stdio
предназначены для ввода и вывода буферизованного файла .Сокет это не файл, а сокет.Он даже не имеет файловой позиции, и требования к буферу совершенно не похожи на обычные файлы - сокеты могут иметь независимые буферы ввода и вывода, а ввод / вывод stdio файла невозможен!
Проблема в том, что file input и file output совместно используют такую же позицию файла, и операционная система может иметь (и действительно будет иметь в Unix) позицию файла, отличную от позиции файлаиз-за буферизации в C будет.
Следовательно, из обоснования C99
Изменение направления ввода / вывода в файле обновления допускается только после успешного fsetpos
,fseek
, rewind
или fflush
, поскольку именно эти функции обеспечивают сброс буфера ввода-вывода.
Обратите внимание, что все это относится только к открытым файламс +
- с файлами, открытыми в любых других стандартных режимах, невозможно смешать ввод и вывод.
Поскольку в стандарте C требуется, чтобы при переключении from input to output on FILE *
одна из функций fsetpos
, rewind
или fseek
, которая по сути вызывает lseek
, должна быть успешной (учтите, чтоfflush
сбрасывает вывод, а не входной буфер!) Перед попыткой выполнения функции вывода ... однако сокет не может быть найден, и поэтому lseek
всегда будет сбой - это означает, что вы не можете использовать FILE *
, который был открыт как для чтения, так и для записи, обертывая сокет для фактически чтения и записи в сокет.
Возможно использоватьfdopen
чтобы открыть FILE *
с потоковыми сокетами, если вам действительно необходимо: просто откройте 2 файлов - один "rb"
для ввода и другой с "wb"
для вывода.