Всем, доброго дня! Мне стало интересно, как реализовать передачу данные p2p... Для этого решил использовать tcp/ip протокол. Узнал, что всё объединяется(локальные пк в сети провайдера) в NAT сервера. И чтобы NAT обменивались данные (локальный p2p мне не нужен) есть много путей, но основные:
1. Проброс портов (пробовал Mono.Nat для C#, miniupnp для python) - ничего не сработало
2. STUN сервер, вроде, код, что нашёл в интернете работает, но как-то некорректно, только отправляет, но не получает данные. (ниже приложу код)
Но я вот не могу понять, а зачем STUN нужен? Чтобы узнать внешний ip? Так может просто мой друг кинуть, но я законнектиться не смогу, ибо
мы просто не найдем друг друга...
Реализация на c# для любопытных
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using LumiSoft.Net.STUN.Client;
namespace Windows_RDR_Host
{
class Program
{
public const string StunServer = "stun4.l.google.com";
public const int StunServerPort = 19302;
public static STUN_Result STUN;
private static Socket socket;
static void Main(string[] args)
{
InitSTUN();
Console.WriteLine("Your public address: {0}", STUN.PublicEndPoint);
new Thread(StartSendCycle).Start();
Console.ReadKey();
}
private static void StartSendCycle()
{
var data = Encoding.ASCII.GetBytes("Hello, RDP!");
var sender = new UdpClient(STUN.PublicEndPoint.Port, AddressFamily.InterNetwork);
sender.AllowNatTraversal(true);
IPEndPoint ipStun = STUN.PublicEndPoint;
while (true)
{
if (sender.Available > 0)
{
byte[] res = sender.Receive(ref ipStun);
Console.WriteLine("Receive: {0}", Encoding.ASCII.GetString(res));
}
sender.Send(data, data.Length, STUN.PublicEndPoint);
Console.WriteLine("Sent " + data.Length + " bytes");
Thread.Sleep(500);
}
}
public static void InitSTUN()
{
socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
socket.Bind(new IPEndPoint(IPAddress.Any, 0));
STUN = STUN_Client.Query(StunServer, StunServerPort, socket);
}
}
}