static internal void Run(UdtSocket conn, string file, bool bVerbose) { int ini = Environment.TickCount; using (var netStream = new UdtNetworkStream(conn)) using (var writer = new BinaryWriter(netStream)) using (var reader = new BinaryReader(netStream)) using (var fileReader = new FileStream(file, FileMode.Open, FileAccess.Read)) { long fileSize = new FileInfo(file).Length; writer.Write(Path.GetFileName(file)); writer.Write(fileSize); byte[] buffer = new byte[512 * 1024]; long pos = 0; int i = 0; ConsoleProgress.Draw(i++, pos, fileSize, ini, Console.WindowWidth / 3); while (pos < fileSize) { int toSend = buffer.Length < (fileSize - pos) ? buffer.Length : (int)(fileSize - pos); fileReader.Read(buffer, 0, toSend); int iteration = Environment.TickCount; writer.Write(toSend); conn.Send(buffer, 0, toSend); if (!reader.ReadBoolean()) { Console.WriteLine("Error in transmission"); return; } pos += toSend; ConsoleProgress.Draw(i++, pos, fileSize, ini, Console.WindowWidth / 3); if (bVerbose) { Console.WriteLine(); Console.WriteLine("Current: {0} / s", SizeConverter.ConvertToSizeString(toSend / (Environment.TickCount - iteration) * 1000)); } } } }
public static void Main(string[] args) { using (UdtSocket client = new UdtSocket(ProtocolType.IPv4, SocketType.Dgram)) { client.Connect(new IPEndPoint(IPAddress.Loopback, 8888)); while (true) { client.SendMessage("Hello 你好 UDT! " + DateTime.Now.ToString()); Console.ReadLine(); } } }
public static void Main(string[] args) { using (UdtSocket server = new UdtSocket(ProtocolType.IPv4, SocketType.Dgram)) { server.Bind(new IPEndPoint(IPAddress.Loopback, 8888)); server.Listen(10); while (true) { IPEndPoint remoteEp; UdtSocket socket = server.Accept(out remoteEp); ThreadPool.QueueUserWorkItem(ReceiveMessage, new object[] { socket, remoteEp }); } } }
static UdtSocket PeerConnect(Socket socket, string remoteAddr, int remotePort) { bool bConnected = false; int retry = 0; UdtSocket client = null; while (!bConnected) { try { DateTime now = InternetTime.Get(); int sleepTimeToSync = SleepTime(now); Console.WriteLine("[{0}] - Waiting {1} sec to sync with other peer", now.ToLongTimeString(), sleepTimeToSync); System.Threading.Thread.Sleep(sleepTimeToSync * 1000); GetExternalEndPoint(socket); if (client != null) { client.Close(); } client = new UdtSocket(socket.AddressFamily, socket.SocketType); client.Bind(socket); Console.Write("\r{0} - Trying to connect to {1}:{2}. ", retry++, remoteAddr, remotePort); client.Connect(new IPEndPoint(IPAddress.Parse(remoteAddr), remotePort)); Console.WriteLine("Connected successfully to {0}:{1}", remoteAddr, remotePort); bConnected = true; } catch (Exception e) { Console.Write(e.Message.Replace(Environment.NewLine, ". ")); } } return(client); }
static void ReceiveMessage(object state) { object[] objects = (object[])state; using (UdtSocket socket = (UdtSocket)objects[0]) { IPEndPoint remoteEp = (IPEndPoint)objects[1]; byte[] buf = new byte[100]; string msg; while ((msg = socket.ReceiveMessage(buf)) != null) { Console.WriteLine("{0} from {1}:{2}", msg, remoteEp.Address, remoteEp.Port); } } Console.WriteLine("Worker thread {0} has exited", Thread.CurrentThread.ManagedThreadId); }
static internal void Run(UdtSocket conn) { int ini = Environment.TickCount; using (UdtNetworkStream netStream = new UdtNetworkStream(conn)) using (BinaryWriter writer = new BinaryWriter(netStream)) using (BinaryReader reader = new BinaryReader(netStream)) { string fileName = reader.ReadString(); long size = reader.ReadInt64(); byte[] buffer = new byte[4 * 1024 * 1024]; int i = 0; ConsoleProgress.Draw(i++, 0, size, ini, Console.WindowWidth / 2); using (FileStream fileStream = new FileStream(fileName, FileMode.Create)) { long read = 0; while (read < size) { int toRecv = reader.ReadInt32(); ReadFragment(reader, toRecv, buffer); fileStream.Write(buffer, 0, toRecv); read += toRecv; writer.Write(true); ConsoleProgress.Draw(i++, read, size, ini, Console.WindowWidth / 2); } } } }
static void Main(string[] args) { CommandLineArguments cla = CommandLineArguments.Parse(args); if (cla == null || (!cla.Sender && !cla.Receiver)) { CommandLineArguments.ShowUsage(); Environment.Exit(1); return; } else if (cla.Sender && String.IsNullOrEmpty(cla.File)) { CommandLineArguments.ShowUsage(); Environment.Exit(1); return; } if (cla.File != null && (!(File.Exists(cla.File)))) { Console.Error.WriteLine($"File {cla.File} does not exist"); Environment.Exit(2); return; } string remoteIp; int remotePort; Socket socket = new Socket( AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); try { if (cla.LocalPort != -1) { Console.WriteLine("Using local port: {0}", cla.LocalPort); } else { cla.LocalPort = 0; } socket.Bind(new IPEndPoint(IPAddress.Any, cla.LocalPort)); P2pEndPoint p2pEndPoint = GetExternalEndPoint(socket); if (p2pEndPoint == null) { return; } Console.WriteLine("Tell this to your peer: {0}", p2pEndPoint.External.ToString()); Console.WriteLine(); Console.WriteLine(); Console.Write("Enter the ip:port of your peer: "); string peer = Console.ReadLine(); if (string.IsNullOrEmpty(peer)) { Console.WriteLine("Invalid ip:port entered"); return; } // try again to connect to external to "reopen" port GetExternalEndPoint(socket); ParseRemoteAddr(peer, out remoteIp, out remotePort); UdtSocket connection = PeerConnect(socket, remoteIp, remotePort); if (connection == null) { Console.Error.WriteLine("Failed to establish P2P conn to {0}", remoteIp); Environment.Exit(3); return; } try { if (cla.Sender) { Sender.Run(connection, cla.File, cla.Verbose); return; } Receiver.Run(connection); } finally { connection.Close(); } } finally { socket.Close(); } }