Как SO_REUSEADDR |SO_REUSEPORT работает в setsockopt? - PullRequest
0 голосов
/ 07 июня 2018

Я слежу за программированием сокетов учебник и появился следующий код

// Forcefully attaching socket to the port 8080
setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT,&opt, sizeof(opt)

С здесь Я вижу, что третий параметр setsocketopt является целым числомкоторый представляет имя опции.После поисков по поиску setsockopt я обнаружил, что почти везде только один из SO_REUSEADDR или SO_REUSEPORT используется с setsockopt.В файле socket.h значение SO_REUSEPORT равно 15, а значение SO_REUSEADDR равно 2. Мой вопрос состоит в том, какова цель побитовой операции ИЛИ в приведенном выше коде?

1 Ответ

0 голосов
/ 07 июня 2018

Этот пример неверен - или, по крайней мере, эта конструкция непереносима.Похоже, что BSD-иши Unix (включая MacOS) определяют эти параметры как битовые маски, и в этом случае, по-видимому, вы можете избежать побитового ИЛИ, объединяя их.Однако setsockopt() является функцией, определенной Posix.См. http://pubs.opengroup.org/onlinepubs/9699919799/functions/setsockopt.html,, где говорится:

Аргумент option_name указывает одиночный параметр для установки.

Вы всегда должны вызывать setsockopt() отдельно для каждой опции, которую вы хотите установить:

// Forcefully attaching socket to the port 8080
setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
setsockopt(server_fd, SOL_SOCKET, SO_REUSEPORT, &opt, sizeof(opt));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...