void Disconnection() { FUP.Message checkMsg = new FUP.Message(); checkMsg.Body = new BodyCheck() { STATE = CONSTANTS.DISCONNECT }; checkMsg.Header = new Header() { MSGID = 0, MSGTYPE = CONSTANTS.CONNECT_STATE_CHECK, BODYLEN = (uint)checkMsg.Body.GetSize(), FRAGMENTED = CONSTANTS.NOT_FRAGMENTED, LASTMSG = CONSTANTS.LASTMSG, SEQ = 0 }; MessageUtil.Send(stream, checkMsg); if (stream != null) { stream.Close(); } if (client != null) { client.Close(); } ConnectedCheck(); }
private void Btn_sendfile_Click(object sender, EventArgs e) { try { IPEndPoint clientAddress = new IPEndPoint(0, 0); IPEndPoint serverAddress = new IPEndPoint(IPAddress.Parse(Server_IP), serverPort); Console.WriteLine("클라이언트: {0}, 서버:{1}", clientAddress.ToString(), serverAddress.ToString()); uint msgId = 0; FUP.Message reqMsg = new FUP.Message(); reqMsg.Body = new BodyRequest() { FILESIZE = new FileInfo(filepath).Length, FILENAME = System.Text.Encoding.Default.GetBytes(filepath) }; reqMsg.Header = new Header() { MSGID = msgId++, MSGTYPE = CONSTANTS.REQ_FILE_SEND, BODYLEN = (uint)reqMsg.Body.GetSize(), FRAGMENTED = CONSTANTS.NOT_FRAGMENTED, LASTMSG = CONSTANTS.LASTMSG, SEQ = 0 }; TcpClient client = new TcpClient(clientAddress); client.Connect(serverAddress); NetworkStream stream = client.GetStream(); MessageUtil.Send(stream, reqMsg); FUP.Message rspMsg = MessageUtil.Receive(stream); if (rspMsg.Header.MSGTYPE != CONSTANTS.REP_FILE_SEND) { LB_serverST.Text = "정상적인 서버 응답이 아닙니다."; return; } if (((BodyResponse)rspMsg.Body).RESPONSE == CONSTANTS.DENIED) { LB_serverST.Text = "서버에서 파일 전송을 거부했습니다."; return; } LB_serverST.Text = "서버 접속 성공"; using (Stream fileStream = new FileStream(filepath, FileMode.Open)) { byte[] rbytes = new byte[CHUNK_SIZE]; long readValue = BitConverter.ToInt64(rbytes, 0); int totalRead = 0; ushort msgSeq = 0; byte fragmented = (fileStream.Length < CHUNK_SIZE) ? CONSTANTS.NOT_FRAGMENTED : CONSTANTS.FRAGMENTED; while (totalRead < fileStream.Length) { int read = fileStream.Read(rbytes, 0, CHUNK_SIZE); totalRead += read; FUP.Message fileMsg = new FUP.Message(); byte[] sendBytes = new byte[read]; Array.Copy(rbytes, 0, sendBytes, 0, read); fileMsg.Body = new BodyData(sendBytes); fileMsg.Header = new Header() { MSGID = msgId, MSGTYPE = CONSTANTS.FILE_SEND_DATA, BODYLEN = (uint)fileMsg.Body.GetSize(), FRAGMENTED = fragmented, LASTMSG = (totalRead < fileStream.Length) ? CONSTANTS.NOT_LASTMSG : CONSTANTS.LASTMSG, SEQ = msgSeq++ }; progressBar1.Value = (int)(((double)totalRead / (double)fileStream.Length) * progressBar1.Maximum); MessageUtil.Send(stream, fileMsg); } Console.WriteLine(); FUP.Message rstMsg = MessageUtil.Receive(stream); BodyResult result = ((BodyResult)rstMsg.Body); Console.WriteLine("파일 전송 성공 : {0}", result.RESULT == CONSTANTS.SUCCESS); } stream.Close(); client.Close(); } catch (SocketException ae) { Console.WriteLine(ae); } MessageBox.Show("클라이언트를 종료합니다"); }
public void FileReceive() { while (true) { FUP.Message reqMsg = MessageUtil.Receive(client.stream); if (reqMsg.Header.MSGTYPE == CONSTANTS.CONNECT_STATE_CHECK) { BodyCheck body = (BodyCheck)reqMsg.Body; if (body.STATE == CONSTANTS.DISCONNECT) { CloseEvent(); continue; } } if (reqMsg.Header.MSGTYPE != CONSTANTS.REQ_FILE_SEND) { CloseEvent(); continue; } BodyRequest reqBody = (BodyRequest)reqMsg.Body; var anwser = MessageBox.Show("파일 업로드 요청이 들어왔습니다. 수락하시겠습니까? Yes / No : ", "파일 업로드 요청", MessageBoxButtons.YesNo, MessageBoxIcon.Information); FUP.Message rspMsg = new FUP.Message(); rspMsg.Body = new BodyResponse() { MSGID = reqMsg.Header.MSGID, RESPONSE = CONSTANTS.ACCEPTED }; rspMsg.Header = new Header() { MSGID = msgId++, MSGTYPE = CONSTANTS.REP_FILE_SEND, BODYLEN = (uint)rspMsg.Body.GetSize(), FRAGMENTED = CONSTANTS.NOT_FRAGMENTED, LASTMSG = CONSTANTS.NOT_LASTMSG, SEQ = 0 }; if (anwser == DialogResult.No) { rspMsg.Body = new BodyResponse() { MSGID = reqMsg.Header.MSGID, RESPONSE = CONSTANTS.DENIED }; MessageUtil.Send(client.stream, rspMsg); CloseEvent(); continue; } else { MessageUtil.Send(client.stream, rspMsg); } lvServState.Items.Add("파일 전송을 시작합니다."); long fileSize = reqBody.FILESIZE; string fileName = Encoding.Default.GetString(reqBody.FILENAME); string saveFolder = Encoding.Default.GetString(reqBody.FOLDERNAME); string saveDir = ""; if (directory.Length == 0) { saveDir = Directory.GetCurrentDirectory(); saveDir = saveDir + "\\" + saveFolder; } else { saveDir = directory + "\\" + saveFolder; } if (Directory.Exists(saveDir) == false) { Directory.CreateDirectory(saveDir); } FileStream file = new FileStream(saveDir + "\\" + fileName, FileMode.Create); uint? dataMsgId = null; ushort prevSeq = 0; while ((reqMsg = MessageUtil.Receive(client.stream)) != null) { if (reqMsg.Header.MSGTYPE != CONSTANTS.FILE_SEND_DATA) { break; } if (dataMsgId == null) { dataMsgId = reqMsg.Header.MSGID; } else { if (dataMsgId != reqMsg.Header.MSGID) { break; } } if (prevSeq++ != reqMsg.Header.SEQ) { lvServState.Items.Add($"{prevSeq}, {reqMsg.Header.SEQ}"); break; } file.Write(reqMsg.Body.GetBytes(), 0, reqMsg.Body.GetSize()); if (reqMsg.Header.FRAGMENTED == CONSTANTS.NOT_FRAGMENTED) { break; } if (reqMsg.Header.LASTMSG == CONSTANTS.LASTMSG) { break; } } long recvFileSize = file.Length; file.Close(); lvServState.Items.Add(""); lvServState.Items.Add($"수신 파일 크기 {recvFileSize} bytes"); FUP.Message rstMsg = new FUP.Message(); rstMsg.Body = new BodyResult() { MSGID = reqMsg.Header.MSGID, RESULT = CONSTANTS.SUCCESS }; rstMsg.Header = new Header() { MSGID = msgId++, MSGTYPE = CONSTANTS.FILE_SEND_RES, BODYLEN = (uint)rstMsg.Body.GetSize(), FRAGMENTED = CONSTANTS.NOT_FRAGMENTED, LASTMSG = CONSTANTS.LASTMSG, SEQ = 0 }; if (fileSize == recvFileSize) { MessageUtil.Send(client.stream, rstMsg); } else { rstMsg.Body = new BodyResult() { MSGID = reqMsg.Header.MSGID, RESULT = CONSTANTS.FAIL }; MessageUtil.Send(client.stream, rstMsg); } lvServState.Items.Add("파일 전송을 마쳤습니다."); } }
void FileSend(FileInfo filepath, string saveFolder) { const int CHUNK_SIZE = 4096; if (saveFolder.Length == 0) { saveFolder = "upload"; } FUP.Message reqMsg = new FUP.Message(); reqMsg.Body = new BodyRequest() { FILESIZE = filepath.Length, FOLDERSIZE = saveFolder.Length, FILENAME = System.Text.Encoding.Default.GetBytes(filepath.Name), FOLDERNAME = System.Text.Encoding.Default.GetBytes(saveFolder) }; reqMsg.Header = new Header() { MSGID = msgId++, MSGTYPE = CONSTANTS.REQ_FILE_SEND, BODYLEN = (uint)reqMsg.Body.GetSize(), FRAGMENTED = CONSTANTS.NOT_FRAGMENTED, LASTMSG = CONSTANTS.NOT_LASTMSG, SEQ = 0 }; MessageUtil.Send(stream, reqMsg); FUP.Message rsqMsg = MessageUtil.Receive(stream); if (rsqMsg.Header.MSGTYPE != CONSTANTS.REP_FILE_SEND) { lvState.Items.Add($"정상적인 서버 응답이 아닙니다. {rsqMsg.Header.MSGTYPE}"); ConnectedCheck(); return; } if (((BodyResponse)rsqMsg.Body).RESPONSE == CONSTANTS.DENIED) { lvState.Items.Add("서버에서 파일 전송을 거부했습니다."); ConnectedCheck(); return; } using (FileStream fileStream = new FileStream(filepath.FullName, FileMode.Open)) { byte[] rbytes = new byte[CHUNK_SIZE]; long readValue = BitConverter.ToInt64(rbytes, 0); int totalRead = 0; ushort msgSeq = 0; byte fragmented = (fileStream.Length < CHUNK_SIZE) ? CONSTANTS.NOT_FRAGMENTED : CONSTANTS.FRAGMENTED; DateTime startTime = DateTime.Now; while (totalRead < fileStream.Length) { int read = fileStream.Read(rbytes, 0, CHUNK_SIZE); totalRead += read; FUP.Message fileMsg = new FUP.Message(); byte[] sendBytes = new byte[read]; Array.Copy(rbytes, 0, sendBytes, 0, read); fileMsg.Body = new BodyData(sendBytes); fileMsg.Header = new Header() { MSGID = msgId, MSGTYPE = CONSTANTS.FILE_SEND_DATA, BODYLEN = (uint)fileMsg.Body.GetSize(), FRAGMENTED = CONSTANTS.FRAGMENTED, LASTMSG = (totalRead < fileStream.Length) ? CONSTANTS.NOT_LASTMSG : CONSTANTS.LASTMSG, SEQ = msgSeq++ }; MessageUtil.Send(stream, fileMsg); } FUP.Message rstMsg = MessageUtil.Receive(stream); BodyResult result = ((BodyResult)rstMsg.Body); TimeSpan resultTime = DateTime.Now - startTime; string RcvResult = result.RESULT == CONSTANTS.SUCCESS ? "성공" : "실패"; lvState.Items.Add($"파일 전송 {RcvResult}"); lvState.Items.Add($"전송 시간 : {resultTime}"); lvState.Items.Add($"저장 폴더 : {saveFolder}"); } }