Можно ли преобразовать дескрипторы сокетов в указатели файлов? - PullRequest
7 голосов
/ 16 октября 2011

Я получил дескриптор для сокета TCP следующим образом:

int desc = accept(socket_descriptor, &client_address, &len)

Теперь из этого дескриптора desc Я хочу получить указатель файла. Может ли fdopen() использоваться здесь?

Причина, по которой я хочу получить указатель файла, заключается в том, что я делаю изменения в существующем коде, который записывает данные в локальный файл. Теперь я хочу расширить его функциональность, чтобы он мог альтернативно записывать в TCP-клиент. Я не хочу переписывать все функции и думал о том, чтобы как-то использовать существующую инфраструктуру. Существующие функции используют файловый указатель для записи в файл. Мне было интересно, можно ли было сделать такую ​​же функцию записи в поток TCP без каких-либо изменений.

1 Ответ

9 голосов
/ 16 октября 2011

Да, fdopen() - это именно то, что вам нужно.Вот что man-страница говорит об этом:

Функция fdopen () связывает поток с существующим файловым дескриптором fd.Режим потока (одно из значений «r», «r +», «w», «w +», «a», «a +») должен быть совместим с режимом файлового дескриптора.Индикатор положения файла в новом потоке устанавливается на принадлежащий fd, а индикаторы ошибок и конца файла очищаются.Режимы "w" или "w +" не вызывают усечение файла.Дескриптор файла не дублируется и будет закрыт, когда поток, созданный функцией fdopen (), будет закрыт.Результат применения fdopen () к объекту общей памяти не определен.

Но используйте его с осторожностью при применении к дескрипторам сокетов.Высокоуровневые функции ввода / вывода используют буферизацию и могут отправлять данные по-разному (т. Е. Сбрасывать всякий раз, когда в потоке обнаруживается \n, вставлять \r) и т. Д.

...