Узнайте тип транспорта для розетки - PullRequest
0 голосов
/ 16 мая 2018

В настоящее время я пытаюсь выяснить ip, порт и тип транспорта сокета inet / inet6 в C.

Проблема в том, что я получил сокет fd, как

int s = socket( ... );
bind(s, soa, soa_len);

Теперь я получил s и хочу узнать, к какому транспорту / интерфейсу / порту он привязан. Интерфейс и порт достаточно просты через

struct sockaddr_storage sa = {};:w
getsockname(s, (struct sockaddr*) &sa, sizeof(sa));
/* parse the fields of sa depending on sa.sa_family */

Однако я не могу найти способ выяснить, является ли s сокетом TCP или UDP - однако он должен быть каким-то образом связан - так:

Как я могу узнать, какой транспортный протокол s использует?

1 Ответ

0 голосов
/ 17 мая 2018

Используйте getsockopt(descriptor, SO_TYPE, ...), как описано в справочной странице man 7 socket.Например:

#include <sys/socket.h>
#include <sys/types.h>
#include <errno.h>

int socket_type(const int fd)
{
    int        type = -1;
    socklen_t  typelen = sizeof type;

    if (fd == -1) {
        errno = EINVAL;
        return -1;
    }
    if (getsockopt(fd, SOL_SOCKET, SO_TYPE, &type, &typelen) == -1)
        return -1;

    errno = 0;
    return type;
}

Для TCP (семейства сокетов AF_INET и AF_INET6) это вернет SOCK_STREAM;для UDP SOCK_DGRAM.

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