(Как) Могу ли я найти тип сокета из дескриптора сокета? - PullRequest
10 голосов
/ 10 июля 2010

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

Я знаю, что могу найти семейство сокетов, используя getsockname, но не смог найти способ найти тип сокета.

Например, я хочу узнать, был ли этот сокет открыт как UDP или TCP. Спасибо за любой совет заранее.

YEH

1 Ответ

19 голосов
/ 10 июля 2010

Поскольку вы упоминаете getsockname Я полагаю, вы говорите о POSIX-сокетах.

Вы можете получить тип сокета, вызвав функцию getsockopt с помощью SO_TYPE. Например:

#include <stdio.h>
#include <sys/socket.h>

void main (void) {
    int fd = socket( AF_INET, SOCK_STREAM, 0 );
    int type;
    int length = sizeof( int );

    getsockopt( fd, SOL_SOCKET, SO_TYPE, &type, &length );

    if (type == SOCK_STREAM) puts( "It's a TCP socket." );
    else puts ("Wait... what happened?");
}

Обратите внимание, что в моем примере не выполняется проверка ошибок. Вы должны исправить это перед использованием. Для получения дополнительной информации см. Документы POSIX.1 для getsockopt () и sys / socket.h .

...