2010-07-10 7 views
8

J'écris un programme pour capturer le flux du réseau de socket pour afficher l'activité du réseau. Pour cela, je me demandais si je pouvais déterminer le type de socket à partir du descripteur de socket.(Comment) Puis-je trouver le type de socket à partir du descripteur de socket?

Je sais que je peux trouver la famille de socket using getsockname mais je n'ai pas pu trouver un moyen de trouver le type de socket. Par exemple, je veux savoir si ce socket était ouvert comme UDP ou TCP. Merci pour tout conseil à l'avance.

YEH

Répondre

16

Puisque vous mentionnez getsockname Je suppose que vous parlez de prises POSIX.

Vous pouvez obtenir le type de socket en appelant la fonction getsockopt avec SO_TYPE. Par exemple:

#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?"); 
} 

Notez que mon exemple ne vérifie pas les erreurs. Vous devriez corriger cela avant de l'utiliser. Pour plus d'informations, consultez les documents POSIX.1 pour getsockopt() et sys/socket.h.

+0

Merci beaucoup! Je vais certainement faire une vérification d'erreur. – YEH

+0

getsockname() et getsockopt() ne sont pas spécifiques à POSIX. L'API Winsock de Microsoft les a également. –

+0

@Remy Lebeau Oui, ils sont tous deux basés sur la couche de socket BSD. Il y a quelques différences critiques, mais un tel usage simple de getsockopt() est susceptible d'être le même. –

Questions connexes