private void ProcessSendFile(SocketAsyncEventArgs e)
        {
            var bytesRead = e.BytesTransferred;

            if (bytesRead > 0 && e.SocketError == SocketError.Success)
            {
                var receiveData = e.Buffer.Skip(e.Offset).Take(bytesRead).ToArray();
                var dataList    = PacketUtils.SplitBytes(receiveData, PacketUtils.ClientRequestFileTag());
                if (dataList != null)
                {
                    foreach (var request in dataList)
                    {
                        if (PacketUtils.IsPacketComplete(request))
                        {
                            int startPosition = PacketUtils.GetRequestFileStartPosition(request);

                            var packetSize = PacketUtils.GetPacketSize(_serverPath, _downloadChannelsCount);
                            if (packetSize != 0)
                            {
                                byte[] filedata     = FileUtils.GetFile(_serverPath, startPosition, packetSize);
                                byte[] packetNumber = BitConverter.GetBytes(startPosition / packetSize);

                                Console.WriteLine("Receive File Request PacketNumber: " + startPosition / packetSize);

                                if (filedata != null)
                                {
                                    //ready to send back to Client
                                    byte[] segmentedFileResponseData = PacketUtils.PacketData(PacketUtils.ServerResponseFileTag(), filedata, packetNumber);

                                    Array.Clear(e.Buffer, e.Offset, e.Count);
                                    Array.Copy(segmentedFileResponseData, 0, e.Buffer, e.Offset, segmentedFileResponseData.Length);

                                    e.Completed -= ProcessFilePosition_Completed;
                                    e.Completed += ProcessSendFile_Completed;

                                    if (!e.AcceptSocket.SendAsync(e))
                                    {
                                        CloseClientSocket(e);
                                    }
                                }
                            }
                        }
                    }
                }
            }
            else
            {
                CloseClientSocket(e);
            }
        }
Esempio n. 2
0
        void udpSockArgs_Completed(object sender, SocketAsyncEventArgs e)
        {
            //소켓 결과가 성공이면 받을 준비
            if (e.SocketError == SocketError.Success)
            {
                //데이터 사용량 누적
                if (e.BytesTransferred > 0)
                {
                    AppLoader.CellularDataUtil.SumUsageCellularData(e.BytesTransferred);
                }

                switch (e.LastOperation)
                {
                case SocketAsyncOperation.SendTo:
                    Deployment.Current.Dispatcher.BeginInvoke(() =>
                    {
                        //입력 비활성화
                        findServerBtn.IsEnabled  = false;
                        portTxtBox.IsEnabled     = false;
                        ItemViewOnPage.IsEnabled = false;
                        //진행상태 표시
                        UIUtils.SetVisibility(labelProgressBar, true);
                        UIUtils.SetVisibility(findProgressBar, true);
                        try
                        {
                            //검색 로딩창 표시
                            bw.RunWorkerAsync();
                        }
                        catch (InvalidOperationException ex)
                        {
                            System.Diagnostics.Debug.WriteLine(ex.Message);
                        }

                        int port      = ((DnsEndPoint)e.RemoteEndPoint).Port;
                        byte[] buffer = new byte[128];
                        e.SetBuffer(buffer, 0, buffer.Length);
                        e.RemoteEndPoint = new IPEndPoint(IPAddress.Any, port);
                        udpSocket.ReceiveFromAsync(e);
                    });
                    break;

                case SocketAsyncOperation.ReceiveFrom:
                    ServerInfo serverInfo = PacketUtils.ResolveServerPacket(PacketTypes.FindServer, e) as ServerInfo;
                    if (serverInfo != null)
                    {
                        Deployment.Current.Dispatcher.BeginInvoke(() =>
                        {
                            //수신된 서버 추가
                            serverInfoList.Add(serverInfo);
                            if (currentHostname.Contains("."))
                            {
                                string host = currentHostname.Substring(currentHostname.LastIndexOf(".") + 1);
                                if (host == "255")
                                {
                                    //나머지 수신 대기
                                    udpSocket.ReceiveFromAsync(e);
                                }
                            }

                            try
                            {
                                //수신이 되면 bw 취소
                                if (bw.WorkerSupportsCancellation)
                                {
                                    bw.CancelAsync();
                                }
                            }
                            catch (InvalidOperationException ex)
                            {
                                System.Diagnostics.Debug.WriteLine(ex.Message);
                            }
                        });
                    }
                    break;
                }
            }
            else
            {
                Deployment.Current.Dispatcher.BeginInvoke(() =>
                {
                    switch (e.SocketError)
                    {
                    case SocketError.HostNotFound:
                        MessageBox.Show(I18n.GetString("AppMessageNotFoundHost"), I18n.GetString("AppMessageNotification"), MessageBoxButton.OK);
                        break;

                    case SocketError.HostUnreachable:
                    case SocketError.NetworkUnreachable:
                    case SocketError.AccessDenied:
                        MessageBox.Show(I18n.GetString("AppMessageUnreachableHost"), I18n.GetString("AppMessageNotification"), MessageBoxButton.OK);
                        break;

                    default:
                        break;
                    }
                    hostTxtBox.Focus();
                });
            }
        }