Добрый день! Насколько я понимаю, есть 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).