Получить сокет peer IPS Linux - PullRequest
       10

Получить сокет peer IPS Linux

0 голосов
/ 02 января 2011

В моем приложении linux c ++ я хочу написать функцию, которая проверит наличие выдающего сокета, если узел сокета является локальным.Я знаю, как получить все локальные IP-адреса, но я не знаю, как проверить, находится ли одноранговый узел в списке локальных IPS.

любая помощь?с кодом пожалуйста !!

10x

1 Ответ

1 голос
/ 02 января 2011

Вы ищете getpeername() для равноправной стороны гнезда. Используйте getsockname() для локальной стороны сокета. Следующий фрагмент извлечет сокеты локальных и одноранговых адресов в домене Интернета. Я оставлю это на ваше усмотрение, чтобы расширить его для обработки других типов сокетов, если у вас есть необходимость. Я включил некоторую элементарную проверку ошибок в качестве бонуса.

int
get_addresses(int sd, struct sockaddr_in *local_ptr,
              struct sockaddr_in *peer_ptr)
{
    int rc = -1;
    if (local_ptr == NULL || peer_ptr == NULL) {
        errno = EFAULT;
        return rc;
    }
    if (sd == -1) {
        errno = EBADF;
        return rc;
    }
    if (local_ptr->sin_family != AF_INET || peer_ptr->sin_family != AF_INET) {
        errno = EINVAL;
        return rc;
    }

    rc = getsockname(sd, (struct sockaddr*)local_ptr,
                     sizeof(struct sockaddr_in));
    if (rc == 0) {
        rc = getpeername(sd, (struct sockaddr*)local_ptr,
                         sizeof(struct sockaddr_in));
        if (rc < 0) {
            if (errno == ENOTCONN) {
                /* socket is not connected so zero out the peer side */
                peer_ptr->sin_len = sizeof(struct sockaddr_in);
                peer_ptr->sin_family = AF_INET;
                peer_ptr->sin_port = 0;
                peer_ptr->sin_addr.s_addr = INADDR_NONE;
                rc = 0;
            }
        }
    }
    return rc;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...