Как accept () определяет, какое целое число вернуть? - PullRequest
2 голосов
/ 20 мая 2011

Использование библиотеки сокетов C в системе Linux ...

Когда я звоню на accept( ), он всегда возвращает целое число. STDIN равно 0. Обычно мой первый вызов accept возвращает 3. После этого они увеличиваются.

Мне было интересно; как accept( ) определяет, какое целое число является следующим? Если после еще 2 accept( ) звонков у меня есть 3, 4 и 5, назначенных подключенным клиентам; что происходит, когда 4 отключается? Следующее целое число 4 или 6?

Если бы кто-то мог пролить некоторый свет на это, я, несомненно, был бы признателен.

Ответы [ 3 ]

3 голосов
/ 20 мая 2011

Используется следующий в настоящее время неоткрытый дескриптор файла, такой же, как open() и другие системные вызовы, которые возвращают дескрипторы файлов;dup2() является исключением из шаблона. (дескриптор файла может быть не открытым, но все еще может быть недоступен для повторного использования, если он, например, был частью сетевого подключения, которое еще не было полностью очищено.) ( Обновление : вычеркнутый текст восстанавливает исходную версию ответа. Если дескриптор файла закрыт, он доступен для повторного использования. Могут возникнуть проблемы с повторным использованием адреса сокета из-за состояний FIN-WAIT в TCP / IP - но адрес сокета не являетсядескриптор файла.)

Если у вас открыты дескрипторы 1-5, затем закройте 4, следующая операция, подобная открытию, вернет 4.

Могут существовать системы безопасности, в которых это не так.шаблон, но вряд ли.Одна из причин заключается в том, что существует правильный код для обработки перенаправления ввода / вывода, который основан на закрытии стандартного ввода (дескриптор файла 0) и следующей операции, подобной открытию, повторно использующей дескриптор файла;повторить для стандартного вывода (дескриптор файла 1).

2 голосов
/ 20 мая 2011

Краткий ответ: НЕ рассчитывайте на то, что приём дает вам целые числа в любом ожидаемом порядке. Неважно, насколько соблазнительно легко вы думаете, что это сделает все, если это произойдет.

То, что возвращает accept, на самом деле является «дескриптором» ресурса ядра, который соединит этот дескриптор с надлежащими драйверами, необходимыми для чтения и записи, закрытия, поиска (если возможно). Пул доступных дескрипторов ограничен, поэтому при закрытии сокета его дескриптор возвращается в пул и может быть использован повторно.

0 голосов
/ 20 мая 2011

Возвращает дескриптор файла для принятого сокета:

RETURN VALUES
     The call returns -1 on error and the global variable errno is set to
     indicate the error.  If it succeeds, it returns a non-negative integer
     that is a descriptor for the accepted socket.

Это дает вам числовое значение, которое можно использовать с различными файловыми операциями, и определяется за кулисами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...