From 0897afeb927beaca539fb48284f8800b05b9feab Mon Sep 17 00:00:00 2001 From: syneffort Date: Wed, 16 Nov 2022 17:21:55 +0900 Subject: [PATCH] update send, receive logic --- SocketStudy/Client/PClientSocket.cs | 2 +- SocketStudy/PComm/PClient.cs | 77 +++++++++++++++++++---------- SocketStudy/PUtil/PFileManager.cs | 11 ++++- 3 files changed, 61 insertions(+), 29 deletions(-) diff --git a/SocketStudy/Client/PClientSocket.cs b/SocketStudy/Client/PClientSocket.cs index 8d5d9c6..7750952 100644 --- a/SocketStudy/Client/PClientSocket.cs +++ b/SocketStudy/Client/PClientSocket.cs @@ -11,7 +11,7 @@ namespace Client { class PClientSocket { - private readonly int BUFF_SIZE = 8192; + private readonly int BUFF_SIZE = 1024 * 50; private Socket sock; private IPEndPoint endPoint; diff --git a/SocketStudy/PComm/PClient.cs b/SocketStudy/PComm/PClient.cs index 55daccf..7ab6bf8 100644 --- a/SocketStudy/PComm/PClient.cs +++ b/SocketStudy/PComm/PClient.cs @@ -8,13 +8,14 @@ using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; +using System.Threading; using System.Threading.Tasks; namespace PComm { public class PClient { - //private readonly int BUFF_SIZE = 8192; + private readonly int BUFF_SIZE = 1024 * 50; public delegate void ClientReceivedHandler(PClient sender, PDataType dataType, byte[] data); public event ClientReceivedHandler OnReceived; @@ -28,7 +29,7 @@ namespace PComm public bool Connected { get { return socket.Connected; } } - public bool DataCompression { get; set; } = false; + public bool DataCompression { get; set; } = true; private Socket socket; @@ -70,48 +71,69 @@ namespace PComm socket.BeginReceive(new byte[] { 0 }, 0, 0, 0, AcceptCallback, null); } + private int SendToSocket(byte[] buffer) + { + try + { + return socket.Send(buffer, SocketFlags.None); + } + catch (Exception ex) + { + Debug.WriteLine($"[ERROR] Socket send: {ex.Message}"); + PFileManager.Instance.WriteLog($"[ERROR] Socket send: {ex.Message}"); + + if (CheckSocketConnection(socket)) + { + socket.BeginReceive(new byte[] { 0 }, 0, 0, 0, AcceptCallback, null); + } + else + { + Debug.WriteLine($"[ERROR] Socket close {socket.RemoteEndPoint.ToString()}"); + PFileManager.Instance.WriteLog($"[ERROR] Socket close {socket.RemoteEndPoint.ToString()}"); + + Close(); + + if (Disconnected != null) + Disconnected(this); + } + + return 0; + } + } + private int SendData(byte[] data) { + byte[] isCompressed; byte[] toSendData; // 데이터 크기 100B 이하 또는 50MB 이상 압축하지 않음 (CPU 부하시간 더 큼) // 압축한 경우 1 전송, 아닌경우 0 전송 if (DataCompression == false || data.Length <= 100 || data.Length >= 50000000) { - byte[] isCompressed = BitConverter.GetBytes(false); - socket.Send(isCompressed, SocketFlags.None); + isCompressed = BitConverter.GetBytes(false); toSendData = data; } else { - byte[] isCompressed = BitConverter.GetBytes(true); - socket.Send(isCompressed, SocketFlags.None); + isCompressed = BitConverter.GetBytes(true); toSendData = PUtil.CompressBytes(data, CompressionLevel.Optimal); } + SendToSocket(isCompressed); byte[] length = BitConverter.GetBytes(toSendData.Length); - socket.Send(length, 0, 4, SocketFlags.None); + SendToSocket(length); - return socket.Send(toSendData, SocketFlags.None); + return SendToSocket(toSendData); } public int Send(string msg) { - socket.Send(BitConverter.GetBytes((int)PDataType.SimpleString), 0, 4, 0); byte[] data = Encoding.UTF8.GetBytes(msg); - //byte[] length = BitConverter.GetBytes(data.Length); - //socket.Send(length, 0, 4, 0); - - //return socket.Send(data, SocketFlags.None); - return SendData(data); + return Send(PDataType.SimpleString, data); } public int Send(PDataType dataType, byte[] data) { - socket.Send(BitConverter.GetBytes((int)dataType), 0, 4, 0); - //byte[] length = BitConverter.GetBytes(data.Length); - //socket.Send(length, 0, 4, 0); - - //return socket.Send(data, SocketFlags.None); + socket.Send(BitConverter.GetBytes((int)dataType), SocketFlags.None); return SendData(data); } @@ -135,20 +157,21 @@ namespace PComm byte[] sizeBuff = new byte[4]; socket.Receive(sizeBuff, sizeBuff.Length, SocketFlags.None); int dataSize = BitConverter.ToInt32(sizeBuff, 0); - + + // ready to receive data; + Thread.Sleep(100); using (MemoryStream ms = new MemoryStream()) { while (dataSize > 0) { byte[] buff; - if (dataSize < socket.ReceiveBufferSize) + if (dataSize < BUFF_SIZE) buff = new byte[dataSize]; else - buff = new byte[socket.ReceiveBufferSize]; + buff = new byte[BUFF_SIZE]; int receiveSize = socket.Receive(buff, buff.Length, SocketFlags.None); - //int receiveSize = socket.Receive(buff, buff.Length, SocketFlags.None); ms.Write(buff, 0, buff.Length); dataSize -= receiveSize; @@ -169,8 +192,8 @@ namespace PComm } catch (Exception ex) { - Debug.WriteLine($"[ERROR] CleintAcceptCallback: {ex.Message}"); - PFileManager.Instance.WriteLog($"[ERROR] CleintAcceptCallback: {ex.Message}"); + Debug.WriteLine($"[ERROR] Socket receive: {ex.Message}"); + PFileManager.Instance.WriteLog($"[ERROR] Socket receive: {ex.Message}"); if (CheckSocketConnection(socket)) { @@ -178,8 +201,8 @@ namespace PComm } else { - Debug.WriteLine($"[ERROR] Close socket {socket.RemoteEndPoint.ToString()}"); - PFileManager.Instance.WriteLog($"[ERROR] Close socket {socket.RemoteEndPoint.ToString()}"); + Debug.WriteLine($"[ERROR] Socket close {socket.RemoteEndPoint.ToString()}"); + PFileManager.Instance.WriteLog($"[ERROR] Socket close {socket.RemoteEndPoint.ToString()}"); Close(); diff --git a/SocketStudy/PUtil/PFileManager.cs b/SocketStudy/PUtil/PFileManager.cs index dd86396..4e3baee 100644 --- a/SocketStudy/PUtil/PFileManager.cs +++ b/SocketStudy/PUtil/PFileManager.cs @@ -41,7 +41,16 @@ namespace PUtility DateTime now = DateTime.Now; string logPath = Path.Combine(this.LogDirPath, $"[{now.ToString("yyyyMMdd")}]log.txt"); - File.AppendAllText(logPath, $"[{now.ToString("yyyyMMdd HH:mm:ss")}] {log + Environment.NewLine}"); + using (FileStream fs = new FileStream(logPath, FileMode.Append, FileAccess.Write, FileShare.ReadWrite)) + { + using (StreamWriter sw = new StreamWriter(fs, Encoding.UTF8)) + { + sw.WriteLine($"[{now.ToString("yyyyMMdd HH:mm:ss")}] {log + Environment.NewLine}"); + sw.Flush(); + } + } + + //File.AppendAllText(logPath, $"[{now.ToString("yyyyMMdd HH:mm:ss")}] {log + Environment.NewLine}"); } } }