#c #linux #sockets #dup
#c #linux #сокеты #дублирование
Вопрос:
Все, наступает зима, пожалуйста, сохраняйте тепло и здоровье. Во время размышлений о работе у меня возник некоторый вопрос о функции fd dup2 . Я создаю сервер сокетов и клиент. сервер отправляет, клиент получает данные. Но теперь я хочу dup2 серверный сокет fd для файла df, чтобы позволить клиенту считывать данные непосредственно из файла, расположенного на сервере. Я пишу как
while(socketdf = принять(...)) { dup2(filefd, socketfd); }
Однако это не работает, возможно ли это? Можете ли вы дать мне какой-либо совет по этому поводу? Спасибо
Комментарии:
1. Всем привет, что, если это fd разделяемой памяти, а не fd файла?
Ответ №1:
dup2()
так не работает — то, что вы в конечном итоге здесь делаете, это закрываете socketfd
и заменяете его копией filefd
.
Нет способа напрямую подключить сокет к файлу, подобного тому, что вы пытаетесь сделать здесь — вам нужно будет «перекачать» данные из файла в сокет в вашем приложении. sendfile()
Однако системный вызов значительно упростит задачу.
Комментарии:
1. Извините,
sendfile(2)
работает только тогда, когдаin_fd
параметр поддерживаетmmap(2)
подобные операции — сокеты не разрешены.2. Хм, я интерпретировал вопрос наоборот — я думал, он хотел позволить серверу сохранять данные в файле, который он мог бы передать клиентам позже. (Кстати, классная собака graviwhatsit.)
3. Критическая формулировка, которую я увидел, была «позволить клиенту считывать данные непосредственно из файла, расположенного на сервере». Эта часть кажется довольно однозначной.
4. Хахаха, потрясающе, мы оба думали, что у нас есть однозначные интерпретации, которые являются полярными противоположностями. Я очень надеюсь, что вы правы, ему будет намного проще, если это так. 🙂
5. Будьте осторожны, это
sendfile(2)
соответствуетNot specified in POSIX.1-2001, or other standards. Other UNIX systems implement sendfile() with different semantics and prototypes. It should not be used in portable programs.
справочной странице.