2010-07-10 4 views
8

Ich schreibe ein Programm, um den Socket-Netzwerkfluss zu erfassen, um die Netzwerkaktivität anzuzeigen. Dafür habe ich mich gefragt, ob es irgendwie möglich ist, den Socket-Typ aus dem Socket-Deskriptor zu bestimmen.(Wie) Kann ich den Socket-Typ aus dem Socket-Deskriptor finden?

Ich weiß, dass ich Socket-Familie mit getsockname finden kann, aber ich konnte keinen Weg finden, Socket-Typ zu finden.

Zum Beispiel möchte ich herausfinden, ob dieser Socket als UDP oder TCP geöffnet war. Danke für jede Beratung im Voraus.

YEH

Antwort

16

Da Sie getsockname erwähne ich nehme an, Sie sprechen über POSIX-Sockets.

Sie können den Socket-Typ erhalten, indem Sie die getsockopt-Funktion mit SO_TYPE aufrufen. Zum Beispiel:

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

Beachten Sie, dass mein Beispiel keine Fehlerüberprüfung durchführt. Sie sollten das beheben, bevor Sie es verwenden. Weitere Informationen finden Sie in den POSIX.1-Dokumenten für getsockopt() und sys/socket.h.

+0

Vielen Dank! Ich werde sicherlich eine Fehlerüberprüfung durchführen. – YEH

+0

getsockname() und getsockopt() sind nicht spezifisch für POSIX. Microsoft Winsock API hat sie auch. –

+0

@Remy Lebeau Ja, sie basieren beide auf der BSD-Socket-Ebene. Es gibt einige kritische Unterschiede, aber eine solche einfache Verwendung von getsockopt() ist wahrscheinlich die gleiche. –

Verwandte Themen