2011-01-09 9 views
5

Ich mache ein C-Programm, in dem ich nach geöffneten UDP-Ports auf dem Zielcomputer suchen muss. Da UDP verbindungslos ist, kann ich den Rückgabewert von connect() nicht wie bei TCP überprüfen.Wie kann ich feststellen, ob ich ein UDP-Paket an einen offenen Port gesendet habe?

send() und sendto() Rückgabewerte sind auch keine Hilfe. Die Handbuchseite gibt an:

Wie kann ich feststellen, ob ich ein UDP-Paket an einen offenen Port auf dem Zielhost gesendet habe?

Antwort

6

Im Allgemeinen können Sie es nicht tun.

Im Prinzip sollte ein Host mit einem geschlossenen Port einen ICMP-Port zurückschicken, der nicht erreichbar ist. Aber sie tun es oft nicht; Ebenso sendet ein ausgefallener oder unzugänglicher Host keine solche Nachricht. Auch einige Firewalls blockieren die Nachricht.

Das Abrufen des Fehlers ist ebenfalls problematisch. Linux hat eine wohldefinierte, aber verwirrende Semantik zum Abrufen von Fehlern in Sockets (für einige Informationen siehe die verschiedenen man-Seiten, socket (7), ip (7) und udp (7)). Manchmal wird ein früherer Fehler angezeigt, wenn Sie beispielsweise eine nicht verwandte sendto() -Funktion ausführen. Andere Betriebssysteme haben leicht unterschiedliche Mechanismen zum Abrufen bestimmter Socket-Fehler.

Wenn es garantiert ist, ein bestimmtes Protokoll auf dem anderen Port zu sein, können Sie ein Paket senden, das eine bestimmte Antwort auslösen sollte (wenn es Ihr eigenes Protokoll ist, können Sie einen Nachrichtentyp "bist du da" hinzufügen), dann kannst du das benutzen. Aber im Allgemeinen hängt es von der Anwendung ab, ob eine Antwort generiert wird, und Sie können nicht unterscheiden zwischen einem Port, auf dem nichts zuhören kann, und einem Port mit etwas, der nicht auf Sie reagiert.

+1

Sorry für das fragen aber wie kann ich sehen, ob es mir den ICMP-Port-unerreichbar gesendet hat? Vielen Dank. – Marian

+0

@Marian: Kannst du noch eine Frage dazu stellen? Ich würde es auch gerne wissen. –

+0

Ich glaube eigentlich nicht, dass es sich lohnt, den ICMP-Port zu erkennen - unerreichbar, weil er nicht ankommen könnte. Dies trifft insbesondere auf Computer zu, auf denen "Personal Firewall" -Produkte installiert sind, die dazu neigen, solche nützlichen Dinge für (meist) fehlgeleitete Sicherheitsgründe zu blockieren. – MarkR

2

Da UDP verbindungslos ist, müssen Sie den Portstatus in Ihrem Anwendungscode überprüfen. Senden Sie beispielsweise ein Paket an den Port und warten Sie auf eine Antwort. Wenn Sie in einer anwendungsspezifischen Zeit keine Antwort erhalten, ist der Port nicht verfügbar.

Sie müssen dies natürlich sowohl auf der sendenden als auch auf der empfangenden Seite entwerfen.

+1

oh ... also gibt es keinen richtigen Weg, es zu überprüfen. Danke – Marian

Verwandte Themen