Découvrez le type de transport pour la prise

Je suis actuellement en train de me débattre avec le type ip, port et transport d’un socket inet / inet6 en C.

Le problème est que j’ai un socket fd comme

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

Maintenant, j’ai s et je veux savoir à quel transport / interface / port il est lié. L’interface et le port sont assez faciles via

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

Cependant, je ne peux pas trouver un moyen de savoir si s est un socket TCP ou UDP – il doit cependant être associé en quelque sorte – Donc:

Comment puis-je trouver les utilisations du protocole de transport?

Utilisez le getsockopt(descriptor, SO_TYPE, ...) comme décrit dans la page de manuel du man 7 socket man. Par exemple:

 #include  #include  #include  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; } 

Pour TCP (familles de socket AF_INET et AF_INET6 ), cela renverra SOCK_STREAM ; pour UDP, SOCK_DGRAM .