Можно ли преобразовать дескрипторы сокетов в указатели файлов?
Я получил дескриптор для сокета 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
) так далее.