Пара глюков
Написал HTTP сервер. Потратил совсем немного времени, но над отдельными недочётами бьюсь уже которые сутки.
Понятное дело: сервер получает данные из сокета. HTTP протокол по определению является текстовым, т.е. в данных присутствуют символы перевода строки, EOF и всё такое. С помощью вызова fdopen() сокет можно превратить в поток и работать уже с ним с помощью функций fprintf(), fscanf(), fgets(). Это значительно упрощает дело, но вот скажите какого: fclose() по умолчанию прикрывает вместе с потоком также и дескриптор сокета. А закрывать нужно, потому что после того как в потоке данных встречается EOF, fread() уходит в глубокий sleep().
Отдельная история связана с каналами или пайпами. Они нужны для корректной реализации CGI интерфейса. Когда на сервер приходит запрос типа POST сервер должен вызвать соответствующую программу и передать через канал входные параметры и через него же прочитать сгенерированную страницу. Везде в man pages написано, что каналы является двунаправленными, но всё равно работают только в одну сторону: сервер –> клиент или клиент -> сервер. Выход заключается в использовании сразу двух каналов. Не знаю, может это дефект FreeBSD, но заставить одновременно писать/читать данные сервер мне так и не удалось.
FreeBSD против Linux. Программа в первой работает, во второй уходит в Segmentation Fault. Например, закрытый дважды файл с помощью fclose() или вызов popen(), если ему передать не “r”, а сразу “r+”, ну не любит Linux двунаправленные каналы, не любит (хотя документация этого и не запрещает)…