2010-07-10 7 views
8

Estoy escribiendo un programa para capturar el flujo de red de socket para mostrar la actividad de la red. Para esto, me preguntaba si hay alguna manera de poder determinar el tipo de socket desde el descriptor de socket.(¿Cómo puedo encontrar el tipo de socket del descriptor de socket?

Sé que puedo encontrar la familia de socket usando getsockname, pero no pude encontrar una forma de encontrar el tipo de socket.

Por ejemplo, quiero encontrar si este socket estaba abierto como UDP o TCP. Gracias por cualquier consejo por adelantado.

YEH

Respuesta

16

Ya que mencionas getsockname Asumo que estás hablando zócalos POSIX.

Puede obtener el tipo de socket llamando a la función getsockopt con SO_TYPE. Por ejemplo:

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

Tenga en cuenta que mi ejemplo no realiza ninguna comprobación de errores. Deberías arreglar eso antes de usarlo. Para obtener más información, consulte los documentos POSIX.1 para getsockopt() y sys/socket.h.

+0

¡Muchas gracias! Ciertamente haré una comprobación de errores. – YEH

+0

getsockname() y getsockopt() no son específicos de POSIX. La API de Winsock de Microsoft también los tiene. –

+0

@Remy Lebeau Sí, ambos se basan en la capa de socket BSD. Existen algunas diferencias críticas, pero es probable que el uso simple de getsockopt() sea el mismo. –

Cuestiones relacionadas