Пример #1
0
        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();
        }
Пример #2
0
        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("클라이언트를 종료합니다");
        }
Пример #3
0
        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("파일 전송을 마쳤습니다.");
            }
        }
Пример #4
0
        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}");
            }
        }