Можно ли преобразовать дескрипторы сокетов в указатели файлов?

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

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

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

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

1 ответ

Решение

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

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

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

Другие вопросы по тегам