Hi!
Jo, Mahlzeit!
Wenn du aber auf der IP-Ebene hantierst, was interessiert dich dann, ob ein Port belegt ist? Du fängst doch das Paket ab, wenn es deins ist und gibt es nicht weiter.
ich nutze c# und poste nun hier mal den relvanten Code:
if (pk.innerProtocol is UDP)
{
if (pk.innerProtocol.DestinationPort == 53)
{
//ask MainDNS Server
pk.innerProtocol.SourcePort += 10; //Port, den die Anwendung blockiert +10
pk.DestinationAdress = new IPAdress("{DNS-Server IP}");
m.SendTo(pk.Data, (EndPoint)(new IPEndPoint(System.Net.IPAddress.Parse("1.0.0.0"), 0))); //SendTo erwartet einen Endpunkt; Wird aber ohnehin irgnoriert, da das IP-Paket komplett abgesetzt wird.
}
else if ((pk.innerProtocol.SourcePort == 53) && (pk.SourceAdress.StringIP.Equals("{DNS-Server IP}")))
{
//answer to Application
pk.innerProtocol.DestinationPort -= 10; //Port -10 um das Paket dem Port andem die Anwendung lauscht zuzustellen
pk.SourceAdress = new IPAdress("{Lokale IP}"); //Source IP zurücksetzen damit das Paket "valide" bei der Anwendung ankommt.
m.SendTo(pk.Data, new IPEndPoint(System.Net.IPAddress.Parse("1.0.0.0"), 0));
}
}
Wenn ich also den Port nicht incrementiere, sendet der DNS Server die Antwort direkt an die Anwendung zurück, die ja an dem Port lauscht. Die Anwendung verwirft es, weil die Absende IP-Adresse nicht stimmt; ist ja in dem Fall die vom DNS und nicht meine lokale.
Problematisch ist halt auch, dass die IP der anfragenden Anwendug die gleiche ist, wie die meines Sockets.
Lo!
Ho!