Отправка файла по отдельному соединению

#unix-socket

#unix-сокет

Вопрос:

У меня есть серверная программа, которая создает поток для каждого входящего соединения. Затем этот поток обрабатывает запрос, получая его и отправляя ответ. Для некоторых типов соединений я должен сначала ответить файлом, а затем текстовым ответом.

Проблема в том, что, если я отправляю текстовый ответ после отправки файла, ответ записывается внутри файла, потому что у клиента нет способа узнать, где заканчивается файл и где находится ответ. Итак, мне нужно закрыть соединение после отправки файла, а затем отправить ответ по другому соединению или, альтернативно, отправить файл по отдельному соединению, а затем отправить ответ по текущему соединению. Как я могу этого добиться?

Комментарии:

1. Почему бы вам не посмотреть, как HTTP обрабатывает это? Он либо отправляет длину первым в Content-Length: заголовке, либо использует фрагментированную кодировку, где он отправляет ответ частями, которым предшествует их длина, используя блок длины 0 для обозначения конца.

2. Это значительно усложнило бы дизайн, я хочу использовать отдельное соединение в стиле FTP, но я не знаю, как правильно создать и использовать второе параллельное соединение.

Ответ №1:

Используйте метод, который использует FTP, чтобы сохранить соединение для передачи данных отдельно от управляющего соединения. Сервер начинает прослушивать временный порт — операционная система назначит ему неиспользуемый порт. Он отправляет этот номер порта клиенту по основному соединению. Затем клиент подключается к временному порту, и сервер отправляет файл по этому новому соединению.

Если вам нужно работать с несколькими сокетами одновременно, вы можете использовать select() или epoll() для ожидания данных по любому из них.

Комментарии:

1. Спасибо за объяснение, я попробую это.