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
.