getsockname всегда возвращает структуру с семейством протоколов 0 - PullRequest
0 голосов
/ 31 марта 2019

getsockname всегда, кажется, заполняет storage структурой, семейство которой установлено в ноль, что означает, что протокол не указан.

void print_address_attached_to_socket(int socket) {
    socklen_t socket_length;
    struct sockaddr_storage storage;
    int returncode = getsockname(socket, (struct sockaddr *) (&storage), &socket_length);
    if (returncode != 0) {
        perror("Errror getting sock name");
        exit(1);
    }
    if (storage.ss_family == 0) {
        std::cout << "Family is unspecified getsockname failed without telling why..." << std::endl;
        return;
    } else {
        struct sockaddr *sock_addr = (struct sockaddr *) &storage;
        char host[128] = {0}, serv[128] = {0};
        returncode = getnameinfo(sock_addr, socket_length, host, 128, serv, 128, NI_NUMERICHOST | NI_NUMERICSERV);
        if (returncode != 0) {
            printf("Errror getting resolving name");
            exit(1);
        }
        std::cout << "Host: " << host << ":" << std::endl;
    }
}

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

Пример использования: https://gist.github.com/Hajto/09058b335b2466033f96a9a1adfebef4 client.cpp: код, вызывающий вышеуказанный фрагмент, который должен получить информацию о хосте, подключенном к сокету server.cpp: поскольку код используется, код используется на клиенте. Я также подключил сервервключить запуск клиента.

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