2012-04-21 8 views

risposta

21

Questo può essere verificato con getsockopt (SO_ACCEPTCONN). Ad esempio:

#include <sys/socket.h> 

int val; 
socklen_t len = sizeof(val); 
if (getsockopt(fd, SOL_SOCKET, SO_ACCEPTCONN, &val, &len) == -1) 
    printf("fd %d is not a socket\n", fd); 
else if (val) 
    printf("fd %d is a listening socket\n", fd); 
else 
    printf("fd %d is a non-listening socket\n", fd); 
-1

Non si può davvero dire. Devi tenerne traccia da solo, e quando vuoi controllare se una presa è la presa di ascolto, confronta quella che hai salvato.

+0

Sì, stavo solo pensando di aggiungerlo a un set di descrittori di file e usarlo per verificare. Grazie per la risposta! –

+2

'getsockopt (SOL_SOCKET, SO_ACCEPTCONN)' è il modo corretto per controllare un socket per l'ascolto. Dovresti accettare invece la risposta di mark4o. –

+0

@RemyLebeau Non lo sapevo. Mentre potrebbe essere più codice, ma si adatta meglio alla domanda dell'OP. –

-1

È possibile eseguire nella riga di comando (in un ambiente Mac/Linux):

lsof -i 

e/o (Linux/Mac/Windows ambiente)

netstat -a 
+0

Ha chiesto una soluzione C (non ero giù). – peterh

0

A rigor di termini, si potrebbe prova ad eseguire un'operazione sul socket che determinerebbe incidentalmente quale tipo di socket è, come provare ad accettare una connessione da esso. Se accept() non riesce con EINVAL, è un buon segno che non sta ascoltando. :)

Tenere traccia di quali prese sono che è una soluzione migliore nel complesso, però. A meno che tu non stia creando un'applicazione davvero banale, è probabile che dovrai comunque mantenere una sorta di dati aggiuntivi su ogni socket.

Problemi correlati