Hi!
Allerdings ist mir das mit dem port +10/-10 nicht geheuer und ich hab im Moment keine ahnung wie ich eine freie Portnummer ermitteln kann. könnte ja mal sein, dass auf port n+10 schon ein anderer Dienst rumkriecht.
Naja, ich bin auch oft im Layer 3 rumgekrochen, erst heute wieder, und da sind mir so Sachen wie SYN/ACK aufgefallen, damit lässt sich schon feststellen, ob ein Port frei ist ;)
Es geht um DNS. Das läuft üblicherweise per UDP. Da gibt es kein SYN/ACK. Außerdem geht es darum, festzustellen ob ein Port auf der eigenen Maschine frei ist. Selbst wenn er TCP für die DNS-Abfrage nimmt (was bei DNS auch möglich ist), ist es wohl kaum der richtige Weg, eine Anfrage zu stellen und dann bis zum Timeout warten zu müssen, und das gegebenenfalls mehrfach zu wiederholen, um einen freien Port zu finden.
Für UDP ist ein Verbindungstest nicht durchführbar, weil keine Verbindung zustandekommt. Ob UDP-Pakete irgendwo landen oder keinen Empfänger finden ist vom Sender aus nicht feststellbar.
Gemäß deinem Vorschlag einen Port zu finden würde auch zu einem TOCTOU-Problem führen, wenn zwischen dem Test und dem Binden an den Port ein anderer Prozess schneller gewesen ist. Da er aber um UDP-Pakete empfangen zu können, sowieso ein Binding an einen Port unternehmen muss, erfährt er dabei sofort, ob er frei ist oder nicht. Für TCP gibt es das Problem des Portfindens üblicherweise nicht, weil man da in der Regel einem TCP-Client nur Ziel-IP und -Port bekanntgibt und den Rest das System erledigt.
Lo!