Проверьте отправителя при прослушивании сокета unix

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

    if(listen(sock_fd, 10) != 0) {
        assert("listen failed");
    }

    while((conn_fd = accept(sock_fd,
                       (struct sockaddr *) &address,
                       &address_length)) != -1) {
        int nbytes = 0;
        static char buffer[PAYLOAD_SZ];
        nbytes = (int)read(conn_fd, buffer, PAYLOAD_SZ);

3 ответа

Решение

Проведя некоторые исследования, я нашел ответ, который наиболее подходит для моих нужд.

с помощью getsockopt я смог получить сверстник.

getsockopt(fd,SOCK_STREAM, LOCAL_PEERPID, &pid, &pid_len); 

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

Для ядра Linux 3.3 и более поздних версий у вас есть командная строка ss -xp,

Этот вопрос о Unix & Linux имеет хорошее обсуждение и ответы, которые могут помочь вам понять.

getpeername() может быть то, что вы ищете. Пример кода:

// assume s is a connected socket

socklen_t len;
struct sockaddr_storage addr;
char ipstr[INET6_ADDRSTRLEN];
int port;

len = sizeof addr;
getpeername(s, (struct sockaddr*)&addr, &len);

// deal with both IPv4 and IPv6:
if (addr.ss_family == AF_INET) {
    struct sockaddr_in *s = (struct sockaddr_in *)&addr;
    port = ntohs(s->sin_port);
    inet_ntop(AF_INET, &s->sin_addr, ipstr, sizeof ipstr);
} else { // AF_INET6
    struct sockaddr_in6 *s = (struct sockaddr_in6 *)&addr;
    port = ntohs(s->sin6_port);
    inet_ntop(AF_INET6, &s->sin6_addr, ipstr, sizeof ipstr);
}

printf("Peer IP address: %s\n", ipstr);
printf("Peer port      : %d\n", port);
Другие вопросы по тегам