Нужен обычный TCP-сокет SOCK_STREAM, не привилегированный SOCK_RAW. Сервер принимает соединение, читает HTTP-заголовки до CRLF CRLF, проверяет GET / и отправляет ответ с длиной тела в байтах.
Создание простого HTTP‑сервера на raw‑сокетах для отдачи статической страницы
Нужен обычный TCP-сокет SOCK_STREAM, не привилегированный SOCK_RAW. Сервер принимает соединение, читает HTTP-заголовки до CRLF CRLF, проверяет GET / и отправляет ответ с длиной тела в байтах.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо построить веб‑сервер, работающий напрямую через необработанные (raw) сокеты. После установления TCP‑соединения с клиентом сервер должен корректно обработать запрос к корневому пути ("/") и отдать заранее подготовленный статический HTML‑файл. В описании следует изложить шаги настройки серверного сокета, процесс принятия соединений, разбор HTTP‑запроса, формирование HTTP‑ответа с заголовками и телом, а также закрытие соединения после отправки данных.
Ответ
Нужен обычный TCP-сокет SOCK_STREAM, не привилегированный SOCK_RAW. Сервер принимает соединение, читает HTTP-заголовки до CRLF CRLF, проверяет GET / и отправляет ответ с длиной тела в байтах.
Последовательность: socket → bind на 127.0.0.1:8080 → listen → accept. На клиентском соединении задайте timeout и предел размера заголовков; один recv не гарантирует получение полного запроса. Разберите стартовую строку, для неподдерживаемого метода верните 405, для другого пути — 404.
Ответ для UTF-8 файла body, прочитанного как bytes:
headers = (
'HTTP/1.1 200 OK\r\n'
'Content-Type: text/html; charset=utf-8\r\n'
f'Content-Length: {len(body)}\r\n'
'Connection: close\r\n\r\n'
).encode('ascii')
connection.sendall(headers + body)
Закройте соединение через with/finally. Не превращайте URL в произвольный файловый путь. Такой учебный сервер не заменяет production HTTP-сервер с полноценным парсером, TLS и защитой от медленных клиентов.