2011-01-09 4 views
5

Sto creando un programma C in cui è necessario verificare la presenza di porte UDP aperte nel computer di destinazione. Poiché UDP è senza connessione, non riesco a controllare il valore restituito di connect() come se fosse possibile con TCP.Come posso sapere se ho inviato un pacchetto UDP a una porta aperta?

send() e sendto() valori di ritorno non sono di aiuto. La pagina di manuale indica:

No indication of failure to deliver is implicit in a send(). Locally 
    detected errors are indicated by a return value of -1. 

Come posso sapere se ho inviato un pacchetto UDP a una porta aperta sull'host di destinazione?

risposta

6

In generale non è possibile farlo.

In linea di principio, un host con una porta chiusa deve restituire una porta ICMP non raggiungibile. Ma spesso non lo fanno; allo stesso modo, un host down o inaccessibile non invierà questo messaggio. Inoltre, alcuni firewall bloccheranno il messaggio.

Anche recuperare l'errore è problematico. Linux ha una semantica ben definita, ma confusa per il recupero degli errori sui socket (per alcune informazioni consultare le varie pagine man, socket (7), ip (7) e udp (7). A volte vedrai un errore precedente riportato quando fai un sendto() non correlato, per esempio. Altri sistemi operativi hanno meccanismi leggermente diversi per il recupero di errori specifici del socket.

Se è garantito un particolare protocollo sull'altra porta, è possibile inviare un pacchetto che dovrebbe suscitare una risposta particolare (se si tratta del proprio protocollo, è possibile aggiungere un tipo di messaggio "ci sei"), allora puoi usare quello. Ma in generale, se una risposta viene generata dipende dall'applicazione e non è possibile distinguere tra una porta con niente in ascolto e una porta con qualcosa che ascolta che decide di non rispondere.

+1

Ci scusiamo per questo, ma come faccio a vedere se mi ha inviato la porta ICMP-irraggiungibile? Grazie. – Marian

+0

@Marian: puoi fare un'altra domanda per questo? Mi piacerebbe anche saperlo. –

+0

In realtà non penso che valga la pena di preoccuparsi di rilevare la porta ICMP, irraggiungibile, poiché potrebbe non arrivare. Questo è particolarmente vero per i computer che hanno installato dei "firewall personali" che tendono a bloccare tali cose utili per (per lo più) ragioni di sicurezza sbagliate. – MarkR

2

Poiché UDP è senza connessione, è necessario controllare lo stato della porta nel codice dell'applicazione. Ad esempio, invia un pacchetto alla porta e attendi una risposta. Se non si ottiene una risposta in alcuni orari specifici dell'applicazione, la porta non è disponibile.

Si deve progettare questo in entrambe le estremità di invio e ricezione, naturalmente.

+1

oh ... quindi non c'è un modo giusto per controllare allora. Grazie – Marian