#unix-socket
#unix-сокет
Вопрос:
У меня есть серверная программа, которая создает поток для каждого входящего соединения. Затем этот поток обрабатывает запрос, получая его и отправляя ответ. Для некоторых типов соединений я должен сначала ответить файлом, а затем текстовым ответом.
Проблема в том, что, если я отправляю текстовый ответ после отправки файла, ответ записывается внутри файла, потому что у клиента нет способа узнать, где заканчивается файл и где находится ответ. Итак, мне нужно закрыть соединение после отправки файла, а затем отправить ответ по другому соединению или, альтернативно, отправить файл по отдельному соединению, а затем отправить ответ по текущему соединению. Как я могу этого добиться?
Комментарии:
1. Почему бы вам не посмотреть, как HTTP обрабатывает это? Он либо отправляет длину первым в
Content-Length:
заголовке, либо использует фрагментированную кодировку, где он отправляет ответ частями, которым предшествует их длина, используя блок длины 0 для обозначения конца.2. Это значительно усложнило бы дизайн, я хочу использовать отдельное соединение в стиле FTP, но я не знаю, как правильно создать и использовать второе параллельное соединение.
Ответ №1:
Используйте метод, который использует FTP, чтобы сохранить соединение для передачи данных отдельно от управляющего соединения. Сервер начинает прослушивать временный порт — операционная система назначит ему неиспользуемый порт. Он отправляет этот номер порта клиенту по основному соединению. Затем клиент подключается к временному порту, и сервер отправляет файл по этому новому соединению.
Если вам нужно работать с несколькими сокетами одновременно, вы можете использовать select()
или epoll()
для ожидания данных по любому из них.
Комментарии:
1. Спасибо за объяснение, я попробую это.