コード例 #1
0
ファイル: Sender.cs プロジェクト: lypvc/p2pcopy
        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));
                                }
                            }
                        }
        }
コード例 #2
0
ファイル: Program.cs プロジェクト: tkggand/udt-netcore
        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();
                }
            }
        }
コード例 #3
0
ファイル: Program.cs プロジェクト: tkggand/udt-netcore
        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 });
                }
            }
        }
コード例 #4
0
ファイル: Program.cs プロジェクト: lypvc/p2pcopy
        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);
        }
コード例 #5
0
ファイル: Program.cs プロジェクト: tkggand/udt-netcore
        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);
        }
コード例 #6
0
        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);
                            }
                        }
                    }
        }
コード例 #7
0
ファイル: Program.cs プロジェクト: lypvc/p2pcopy
        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();
            }
        }