LINUX.ORG.RU

Сокеты и дескрипторы


0

0

Добрый день! Насколько я понимаю, есть 3 способа писать-читать в сокеты:

1. Использовать интерфейс сокетов (recv, send). Используется т.н. дескриптор сокета, возвращаемый функциями accept() у сервера и непосредственно socket() у клиента. Правда, socket() у сервера тоже возвращает дескриптор, но после accept() мы имеем дескриптор, «направленный» на конкретного клиента. А поскольку у клиента по одному сокету всегда «висит» один сервер, то там достаточно того, что возвращает socket(). При этом что будет, если сервер запишет что-нибудь через send() и дескриптор, возвращенный ему socket() – неясно. Кто из клиентов это получит? 2. Как известно, дескриптор сокета ничем (с определенной точки зрения) не отличается от дескриптора файла, они указывают на элементы в одной таблице и т.д. Можно (по крайней мере клиенту) закрыть перед подключением 1-й или 2-й дескрипторы через close(), и потом сокет получит этот номер (первый не занятый в таблице дескрипторов), при этом он встанет на место stdout или stderr. Можно будет работать с ним как с stdout, например. Говорили, что в данном случае всю работу на себя возьмет демон inetd. Правда, мне не ясно, можно ли поставить сокет одновременно на место stdin и stdout (видимо, сдублировав дескриптор, например, через fcntl), и каков режим его открытия применительно к обычным режимам открытия файлов (я подозреваю, что у каждого сокета это – одновременно на чтение и запись). И неясно, может ли сервер так делать... 3. Можно, наверное, писать в сокет как в файл. Правда, все функции (fwrite(), fputs() и др.) требуют параметр типа FILE*. Как преобразовать int (дескриптор) в FILE*, ума не приложу.

Все 3 подхода наверняка имеют свои плюсы и минусы. Но я никак не пойму, какие. Прошу совета. Наверное, какой-то более переносим, а какой-то менее? И вы, лично вы, если бы вам дали писать простенький клиент SMTP, скажем, вы бы какой из трех подходов выбрали и почему? А какой бы не выбрали и почему? А если клиент/сервер FTP? (ну и пара вопросов была задана в самой формулировке пунктов 1, 2, 3).


Re: Сокеты и дескрипторы

2. dup2(), fcntl(F_DUPFD).
3. fdopen().

const86 ★★★★★
()

Re: Сокеты и дескрипторы

много букв а я бухой, на вскидку- man sendfile

nikolayd
()

Re: Сокеты и дескрипторы

3. Использовать write вместо fwrite, read вместо fread и т.д. Они, как раз то и используют int в качестве дескриптора

Torvus
()
Ответ на: Re: Сокеты и дескрипторы от Torvus

Re: Сокеты и дескрипторы

> Использовать write вместо fwrite, read вместо fread и т.д. Они, как раз то и используют int в качестве дескриптора

Это мелочи. Они ещё и буферизацию не делают, а это может здорово повлиять на производительность.

const86 ★★★★★
()

Re: Сокеты и дескрипторы

почитай Стивенса. Unix: разработка сетевых приложений. Это очень хорошая книга, она тебе на все вопросы ответит.

> Говорили, что в данном случае всю работу на себя возьмет демон inetd


наоборот, если ты заюзаешь inetd, он за тебя будет устанавливать соединение с клиентом, а тебе предоставит stdin и stdout привязанные к сокетам. То же самое ты можешь сделать и сам, если, например, тебя не устраивает то, что inetd делает fork твоего кода на каждое новое соединение с клиентом

BreadFan ★★
()

Re: Сокеты и дескрипторы

fdopen(socket, "a+");
так вроде работает

anonym43
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.