Frage ist unten. Hier ist mein aktueller Testcode, der nicht erfolgreich war.Wie mache ich TCP-Lochung?
static void Main(string[] args)
{
if (args.Count() != 3)
{
Console.WriteLine("Bad args");
}
var ep = new IPEndPoint(IPAddress.Parse(args[0]), int.Parse(args[1]));
var lp = new IPEndPoint(IPAddress.Any, int.Parse(args[2]));
var s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
s.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
s.Bind(lp);
var c = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
c.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
c.Bind(lp);
Task.Run(() => { try { c.Connect(ep); } catch { } });
s.Listen(10);
var v = s.Accept();
v.Close();
}
Wie kann ich tun TCP Lochen? Ich teste mit einem Remote-Server. Ich lasse wget local_public_ip:port/test
laufen. Ich habe mein Router-Setup für Port 80, so dass es keinen Locher braucht. Mein Code hat eine Verbindung. Jetzt versuche ich andere Ports und ich kann nicht genau herausfinden, wie man das Loch schlägt.
Was ich getan haben, ist (C# -Code)
var l = new TcpListener(8090);
l.Start();
try { var o = new TcpClient(); o.Connect("myserverip", 123); }
catch(Exception ex) {}
var e = l.AcceptSocket();
Console.WriteLine(e.RemoteEndPoint.AddressFamily);
Ich dachte, vielleicht ich einrichten müssen den lokalen Endpunkt auf der TCP-Verbindung aus.
TcpClient(new System.Net.IPEndPoint(new System.Net.IPAddress(bytearray), port));
Ich habe einen Fehler gemacht und bekam diese Ausnahme
The requested address is not valid in its context
den Byte-Array zu 192,168,1,5
Fixing bis es richtig ausgehende Verbindungen zu machen scheint. Jetzt, da ich eine Out-Verbindung zu der Remote-IP mit meinem Abhör-Port habe, dachte ich, wget würde sich mit mir verbinden können. Es war nicht der Fall
Wie mache ich TCP-Lochung?
Haben Sie den lokalen Port von "o" als 8090 eingerichtet? Sie sprechen darüber, aber der Code stimmt nicht überein. Bitte aktualisieren Sie den Code. Entfernen Sie alle nicht definierten Variablen wie Bytearray und Port. wget muss sich von Port 123 aus verbinden. Hast du es geschafft? Wenn Sie keinen anderen Client verwenden. – usr
@usr: Ich schrieb 'wget http: // mylocalip: 8090/test' Der' TcpClient o' soll eine Dummy-Verbindung herstellen. Port ist = 8090.Ich dachte, wenn der lokale Port der ausgehenden Verbindung der lokale Port ist, den ich höre, dann, wenn die entfernte Verbindung versucht, sich mit dem gleichen Port zu verbinden, wird der Router es durchlassen. Vielleicht funktioniert es aber nicht auf meinem Router. ABER gibt es Software, die erfolgreich ein Loch in meinem Router lochen. –
Das sind neue Informationen, aber meine Fragen sind immer noch teilweise unbeantwortet: Haben Sie den lokalen Port von o zum 8090 eingerichtet? Sie sprechen darüber, aber der Code stimmt nicht überein. Bitte aktualisieren Sie den Code. Wenn Sie mit "o" anrufen, aktivieren Sie das Tuple (your-ip, your-port, remote-ip, remote-port) für die Kommunikation. Dies bedeutet, dass jede weitere Kommunikation diese Werte verwenden muss. wget muss Port 123 verwenden. o muss Port 8090 verwenden. Für den Fall, dass Sie nicht wissen: Ausgehende Verbindungen können auch den lokalen Port steuern. Das ist nur selten. – usr