NPSBDummyLib.EchoCondition GetTestEchoConfig()
        {
            var config        = GetTestBaseConfig();
            var repeatCount   = textBox8.Text.ToInt32();
            var repeatTimeSec = textBox7.Text.ToInt32();

            var echoCondi = new NPSBDummyLib.EchoCondition();

            echoCondi.IP            = DummyManager.GetDummyInfo.RmoteIP;
            echoCondi.Port          = DummyManager.GetDummyInfo.RemotePort;
            echoCondi.PacketSizeMin = textBox10.Text.ToInt32();
            echoCondi.PacketSizeMax = textBox11.Text.ToInt32();
            echoCondi.Set(repeatCount, repeatTimeSec);

            return(echoCondi);
        }
        public async Task TestRepeatEchoAsync(Int64 testUniqueId, EchoCondition echoCondi)
        {
            var startTime   = DateTime.Now;
            var testResults = new List <Task <(bool, string)> >();

            for (int i = 0; i < DummyList.Count; ++i)
            {
                var dummy = DummyList[i];
                testResults.Add(Task <(bool, string)> .Run(async() => {
                    var echoAction = new ActionEcho();
                    return(await echoAction.EchoAsync(dummy, echoCondi));
                }));
            }

            await Task.WhenAll(testResults.ToArray());

            TestResultMgr.AddTestResult(testUniqueId, Config.ActionCase, DummyList, startTime);
        }
        //public Action<string> MsgFunc; //[진행중] [완료] [실패]

        public async Task <(bool, string)> EchoAsync(Dummy dummy, EchoCondition cond)
        {
            var clientSocket = dummy.ClientSocket;

            SendPacket.Init(cond.PacketSizeMax);
            RecvPacket.Init(cond.PacketSizeMax);

            int curEchoCount = 0;

            try
            {
                var(result, error) = await clientSocket.ConnectAsync(cond.IP, cond.Port);

                if (result == false)
                {
                    return(false, error);
                }

                while (true)
                {
                    // 스레드 잘 사용하는지 알기 위해 스레드 번호찍기
                    //Utils.Logger.Debug($"Echo-Send. ClientIndex: {dummy.Index}");

                    SendPacket.SetData(cond.PacketSizeMin, cond.PacketSizeMax);
                    var sendError = await clientSocket.SendAsync(SendPacket.BufferSize, SendPacket.BufferData);

                    if (sendError != "")
                    {
                        return(End(dummy, curEchoCount, false, sendError));
                    }


                    // 스레드 잘 사용하는지 알기 위해 스레드 번호찍기
                    //Utils.Logger.Debug($"Echo-Recv. ClientIndex: {dummy.Index}");

                    var(recvCount, recvError) = await clientSocket.ReceiveAsync(RecvPacket.BufferSize, RecvPacket.RecvBuffer);

                    if (recvError != "")
                    {
                        return(End(dummy, curEchoCount, false, recvError));
                    }

                    if (recvCount > 0)
                    {
                        RecvPacket.Received(recvCount);
                    }
                    else if (recvCount == 0)
                    {
                        return(End(dummy, curEchoCount, false, "연결 종료"));
                    }


                    if (SendPacket.BodyData() != RecvPacket.BodyData())
                    {
                        return(End(dummy, curEchoCount, false, "데이터 틀림"));
                    }


                    ++curEchoCount;

                    if (cond.IsEnd(curEchoCount))
                    {
                        break;
                    }
                }

                return(End(dummy, curEchoCount, true, ""));
            }
            catch (Exception ex)
            {
                return(false, ex.ToString());
            }
        }