Como faço a furação TCP?
A pergunta está abaixo. Aqui está o meu código de teste atual que não teve êxito.
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();
}
Como faço a furação TCP? Estou testando usando um servidor remoto. Estou correndowget local_public_ip:port/test
. Eu tenho o meu roteador configurado para a porta 80, para que não precise de um furador. Meu código tem uma conexão. Agora eu experimento outras portas e não consigo descobrir exatamente como perfurar o buraco.
O que eu fiz é (código C #)
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);
Eu pensei que talvez eu precise configurar o ponto de extremidade local na conexão TCP de saída.
TcpClient(new System.Net.IPEndPoint(new System.Net.IPAddress(bytearray), port));
Eu cometi um erro e recebi essa exceção
The requested address is not valid in its context
Corrigindo a matriz de bytes para192,168,1,5
parece fazer conexões de saída corretamente. Agora que tenho uma conexão externa ao IP remoto usando minha porta de escuta, pensei que o wget seria capaz de se conectar a mim. Não foi o caso
Como faço a furação TCP?