コード例 #1
0
 private void SendTheme_PostExecute(SendThemeResults obj)
 {
     IsBusy = false;
     if (obj.Sent)
     {
         MessageBox.Show(MainResources.Message_ThemeSent,
                         WINDOW_TITLE,
                         MessageBoxButton.OK,
                         MessageBoxImage.Information);
     }
 }
コード例 #2
0
        private Task <SendThemeResults> SendTheme_Execute(string ip, bool start)
        {
            var sendingTheme    = MainResources.Busy_Sender_SendingTheme;
            var connecting      = MainResources.Busy_Sender_Connecting;
            var connectionError = MainResources.Busy_Sender_ConnectionError;

            var bgmPath      = Path.Combine(Path.GetDirectoryName(ThemePath), BGM_FILE_NAME);
            var zipThemeTask = ZipTheme_Execute(bgmPath, false);
            var task         = new Task <SendThemeResults>(() =>
            {
                var result = new SendThemeResults
                {
                    IP   = ip,
                    Sent = false,
                };

                IPAddress addr;
                if (!IPAddress.TryParse(ip, out addr))
                {
                    return(result);
                }

                var endPoint = new IPEndPoint(addr, 5000);
                var socket   = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

                zipThemeTask.Start();
                result.Zip = zipThemeTask.Result;

                var tries     = 0;
                var maxTries  = Settings.Default.SocketMaxTries;
                var connected = false;
                while (!connected)
                {
                    try
                    {
                        BusyText = connecting + $" [{++tries}/{maxTries}]";
                        socket.Connect(endPoint);
                        connected = true;
                    }
                    catch (SocketException)
                    {
                        if (tries >= maxTries)
                        {
                            return(result);
                        }
                    }
                }

                BusyText = sendingTheme;

                byte[] socketBuffer = new byte[16];

                socket.Receive(socketBuffer, 11, SocketFlags.None);
                if (Encoding.ASCII.GetString(socketBuffer, 0, 11) != "YATA SENDER")
                {
                    BusyText = connectionError;
                    socket.Close();
                    return(result);
                }

                var toWrite = result.Zip.Data.Length;
                var offset  = 0;
                var fLen    = (float)result.Zip.Data.Length / 100;

                Stopwatch sw = new Stopwatch();
                sw.Start();
                float averageSample = 0;
                var lastOffset      = 0;
                while (true)
                {
                    var step = Math.Min(toWrite, 8192);
                    socket.Send(result.Zip.Data, offset, step, 0);
                    toWrite -= step;
                    offset  += step;

                    if (sw.ElapsedMilliseconds > 100)
                    {
                        float trans   = sw.ElapsedMilliseconds;
                        var delta     = (offset - lastOffset);
                        lastOffset    = offset;
                        averageSample = (averageSample * 0.75f) + (delta / trans * 0.25f);

                        BusyText = $"Sending: {offset / fLen:f2}%" + Environment.NewLine +
                                   $"Rate: {(int)(averageSample / 1.024)}KB/s";
                        sw.Restart();
                    }

                    if (toWrite <= 0)
                    {
                        break;
                    }
                }
                sw.Stop();

                socket.Receive(socketBuffer, 9, SocketFlags.None);
                if (Encoding.ASCII.GetString(socketBuffer, 0, 9) != "YATA TERM")
                {
                    BusyText = connectionError;
                    socket.Close();
                    return(result);
                }

                socket.Close();
                result.Sent = true;
                return(result);
            });

            if (start)
            {
                task.Start();
            }
            return(task);
        }
コード例 #3
0
        private Task<SendThemeResults> SendTheme_Execute(string ip, bool start)
        {
            var sendingTheme = MainResources.Busy_Sender_SendingTheme;
            var connecting = MainResources.Busy_Sender_Connecting;
            var connectionError = MainResources.Busy_Sender_ConnectionError;

            var bgmPath = Path.Combine(Path.GetDirectoryName(ThemePath), BGM_FILE_NAME);
            var zipThemeTask = ZipTheme_Execute(bgmPath, false);
            var task = new Task<SendThemeResults>(() =>
            {
                var result = new SendThemeResults
                {
                    IP = ip,
                    Sent = false,
                };

                IPAddress addr;
                if (!IPAddress.TryParse(ip, out addr))
                    return result;

                var endPoint = new IPEndPoint(addr, 5000);
                var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

                zipThemeTask.Start();
                result.Zip = zipThemeTask.Result;

                var tries = 0;
                var maxTries = Settings.Default.SocketMaxTries;
                var connected = false;
                while (!connected)
                {
                    try
                    {
                        BusyText = connecting + $" [{++tries}/{maxTries}]";
                        socket.Connect(endPoint);
                        connected = true;
                    }
                    catch (SocketException)
                    {
                        if (tries >= maxTries)
                            return result;
                    }
                }

                BusyText = sendingTheme;

                byte[] socketBuffer = new byte[16];

                socket.Receive(socketBuffer, 11, SocketFlags.None);
                if (Encoding.ASCII.GetString(socketBuffer, 0, 11) != "YATA SENDER")
                {
                    BusyText = connectionError;
                    socket.Close();
                    return result;
                }

                var toWrite = result.Zip.Data.Length;
                var offset = 0;
                var fLen = (float) result.Zip.Data.Length / 100;

                Stopwatch sw = new Stopwatch();
                sw.Start();
                float averageSample = 0;
                var lastOffset = 0;
                while (true)
                {
                    var step = Math.Min(toWrite, 8192);
                    socket.Send(result.Zip.Data, offset, step, 0);
                    toWrite -= step;
                    offset += step;

                    if (sw.ElapsedMilliseconds > 100)
                    {
                        float trans = sw.ElapsedMilliseconds;
                        var delta = (offset - lastOffset);
                        lastOffset = offset;
                        averageSample = (averageSample * 0.75f) + (delta / trans * 0.25f);

                        BusyText = $"Sending: {offset / fLen:f2}%" + Environment.NewLine +
                                   $"Rate: {(int)(averageSample / 1.024)}KB/s";
                        sw.Restart();
                    }

                    if (toWrite <= 0)
                        break;
                }
                sw.Stop();

                socket.Receive(socketBuffer, 9, SocketFlags.None);
                if (Encoding.ASCII.GetString(socketBuffer, 0, 9) != "YATA TERM")
                {
                    BusyText = connectionError;
                    socket.Close();
                    return result;
                }

                socket.Close();
                result.Sent = true;
                return result;
            });
            if (start)
                task.Start();
            return task;
        }
コード例 #4
0
 private void SendTheme_PostExecute(SendThemeResults obj)
 {
     IsBusy = false;
     if (obj.Sent)
     {
         MessageBox.Show(MainResources.Message_ThemeSent,
             WINDOW_TITLE,
             MessageBoxButton.OK,
             MessageBoxImage.Information);
     }
 }