Доступ к базовым данным гнезда Boost Asio - PullRequest
1 голос
/ 09 апреля 2020

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

auto remoteEp = peerSocket.remote_endpoint();
auto IPaddress = remoteEp.address();
auto portNumber = remoteEp.port();

Это делается только в том случае, если сокет подключен к удаленному клиенту.

1 Ответ

1 голос
/ 09 апреля 2020

Это невозможно. Это предполагает, что эти объекты имеют копии этих данных внутри. Что они могут или не могут (они на самом деле не делают).

Вместо функций используются функции getpeername с sys/socket.h на linux.

На windows или cygwin, Asio на самом деле кеширует удаленную конечную точку, проверяя, остается ли время соединения таким же, как и при последнем получении. Это по-прежнему означает, что вы не можете иметь ссылку.

Если вы используете Windows сокеты IOCP, тогда native_handle_type будет дополнительно содержать копию удаленной конечной точки, которую можно проверить с помощью .have_remote_endpoint() и извлекается с помощью .remote_endpoint() (все еще по значению).

Сводка

Ссылки небезопасны в сценарии параллелизма ios. Время жизни объектов не зависит от мира с асинхронными операциями c.

Я чувствую, что ваш вопрос может быть вызван необходимостью оптимизации. В этом случае, безусловно, самым простым вариантом будет просто кэшировать значение самостоятельно в месте, где вы управляете временем жизни объекта.

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