← Все записи

Пара глюков

  • программирование
  • unix
  • программинг

Написал 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 двунаправленные каналы, не любит (хотя документация этого и не запрещает)…