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); } }
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(); }); } }