Дескрипторы сокетов и файлов

Я изучаю сетевое программирование в Unix и в настоящее время пытаюсь понять концепцию сокетов и файловых дескрипторов. Насколько я понял, файловый дескриптор - это просто позиция в массиве указателей (таблица файловых дескрипторов?), И эти указатели указывают на файл где-то в памяти.

Дескрипторы сокетов совместно используют этот массив с файловыми дескрипторами, но вместо этого указатель ссылается на сокет. Или есть что-то еще, что используется только для сокетов?

Является ли этот массив уникальным для каждого приложения / процесса?


person Carlj901    schedule 14.11.2012    source источник


Ответы (3)


Да, сокеты также являются индексами в той же таблице, что и файлы. По крайней мере, для систем UNIX (таких как Linux и OSX) Windows отличается, поэтому вы не можете использовать, например, read и write для приема и отправки данных.

У каждого процесса есть своя собственная таблица дескрипторов «файлов».

person Some programmer dude    schedule 14.11.2012
comment
Верна ли моя интерпретация файловых дескрипторов в остальном и можно ли сказать, что таблица файловых дескрипторов представляет собой своего рода полиморфизм? - person Carlj901; 14.11.2012
comment
@ Carlj901 Да, вроде как. Дескриптор файла (возвращаемый open или socket) является индексом в этой таблице или указателем, этот указатель может затем указывать на различные структуры в зависимости от того, является ли это файлом или сокетом. - person Some programmer dude; 14.11.2012

Socket - это не что иное, как файл в операционной системе UNIX. Даже в операционной системе UNIX все рассматривается как файл. Всякий раз, когда мы создаем сокет, в таблице дескрипторов файла делается запись, которая содержит стандартный ввод-вывод, стандартные ошибки и другие детали. Дескриптор файла действует как указатель на таблицу файлов, которая содержит информацию о том, какое действие должно быть предпринято, например, чтение, запись и т. Д., И он содержит указатели на таблицу индексных дескрипторов этого конкретного файла, и, как вы, возможно, знаете, индексы содержат все необходимые детали файла.

person Navneet    schedule 09.01.2016
comment
Все ли в UNIX обрабатывается как файл? Как все процессы? Также как выглядит файл сокета или что он содержит? - person gfdsal; 08.07.2017
comment
Может показаться, что файловые дескрипторы - это указатели на файловые таблицы, так как файловый дескриптор определяется как целое число. Может быть, лучше сказать, что файловые дескрипторы - это индексы (множественное число для индекса) массива таблиц файловых дескрипторов в ядре. - person Dražen G.; 16.03.2021

Нет никакой разницы между сокетом (дескриптором) и файловым дескриптором (ами). Сокет - это просто особая форма файла. Например, вы можете использовать те же системные вызовы read () и write () для дескрипторов сокетов, которые используются для файловых дескрипторов.

ssize_t send(int sockfd, const void *buf, size_t len, int flags);

Единственная разница между send () и write () - это наличие аргумента flags. Если аргумент flags равен нулю, send () эквивалентен write ().

person Community    schedule 20.11.2018
comment
Но файл отличается от файловых дескрипторов, не так ли? Как сокет может быть как файловым, так и файловым дескриптором? Я чувствую, что сокет похож на дескриптор файла, а буфер сокета похож на файл. - person Brad Pitt; 15.01.2021