From 77ba1593e22cb745d731d2f71ca387abbebb4266 Mon Sep 17 00:00:00 2001 From: sin365 <353374337@qq.com> Date: Fri, 29 Mar 2024 18:02:54 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E4=B8=8A=E8=A1=8Cbug=E8=A7=A3=E5=86=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Lib/HaoYueNet.ClientNetwork.dll | Bin 19968 -> 20992 bytes Lib/HaoYueNet.ServerNetwork.dll | Bin 24576 -> 24064 bytes .../Manager/AppLocalClient.cs | 3 +- .../LocalClient/LocalListener_Source.cs | 290 ++++++++++++++++++ NoSugarNet.ServerCore/NetWork/IOCPNetWork.cs | 2 +- 5 files changed, 293 insertions(+), 2 deletions(-) create mode 100644 NoSugarNet.ClientCore/Manager/LocalClient/LocalListener_Source.cs diff --git a/Lib/HaoYueNet.ClientNetwork.dll b/Lib/HaoYueNet.ClientNetwork.dll index 6eb54c8ae17ce4128b93c00e88b38a1736ec67f7..bc3795c09dfe097d8b0fb589a2bb57a6e3f8e2cf 100644 GIT binary patch literal 20992 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 U>ohDI#p;+m+eJNizKhrY1tU*vw*UYD literal 19968 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 BAy5DS literal 24576 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 M$+zM8`Jes#A6T?x6951J diff --git a/NoSugarNet.ClientCore/Manager/AppLocalClient.cs b/NoSugarNet.ClientCore/Manager/AppLocalClient.cs index 07589c0..7c328a4 100644 --- a/NoSugarNet.ClientCore/Manager/AppLocalClient.cs +++ b/NoSugarNet.ClientCore/Manager/AppLocalClient.cs @@ -52,6 +52,7 @@ namespace ServerCore.Manager AppNoSugarNet.log.Debug($"开始监听配置 Tunnel:{cfg.Key},Port:{cfg.Value.Port}"); listener.Init(); listener.Start(new IPEndPoint(IPAddress.Any.Address, (int)cfg.Value.Port)); + //listener.Init((int)cfg.Value.Port); AddLocalListener(listener); } @@ -103,7 +104,7 @@ namespace ServerCore.Manager { LocalListener _listener = mDictTunnelID2Listeners[keys[i]]; _listener.StopAll(); - _listener.Stop(); + //_listener.Stop(); RemoveLocalListener(_listener); } } diff --git a/NoSugarNet.ClientCore/Manager/LocalClient/LocalListener_Source.cs b/NoSugarNet.ClientCore/Manager/LocalClient/LocalListener_Source.cs new file mode 100644 index 0000000..0ed1064 --- /dev/null +++ b/NoSugarNet.ClientCore/Manager/LocalClient/LocalListener_Source.cs @@ -0,0 +1,290 @@ +using HaoYueNet.ClientNetwork.OtherMode; +using HaoYueNet.ServerNetwork; +using System.Net.Sockets; + +namespace NoSugarNet.ClientCore +{ + public class LocalListener_Source : NetworkHelperCore_ListenerMode + { + public byte mTunnelID; + public long mReciveAllLenght; + public long mSendAllLenght; + public LocalListener_Source(int numConnections, int receiveBufferSize, byte TunnelID) + : base() + { + OnConnected += ClientNumberChange; + OnReceive += ReceiveData; + OnDisconnected += OnDisconnectClient; + OnNetLog += OnShowNetLog; + + mTunnelID = TunnelID; + } + + private void ClientNumberChange(Socket socket) + { + Console.WriteLine("Client数发生变化"); + //增加连接数 + int Idx = AddDictSocket(socket); + if (GetSocketByIdx(Idx, out LocalClientInfo _localClientInf)) + { + AppNoSugarNet.local.OnClientLocalConnect(mTunnelID, (byte)Idx); + } + } + + /// + /// 通过下标发送 + /// + /// + /// + public void SendSocketByIdx(int Idx, byte[] data) + { + if (GetSocketByIdx(Idx, out LocalClientInfo _localClientInfo)) + { + mSendAllLenght += data.Length; + SendToClient(_localClientInfo._socket, data); + } + //TODO连接前缓存数据 + } + + /// + /// 接受包回调 + /// + /// 协议ID + /// 错误编号 + /// 业务数据 + private void ReceiveData(Socket sk, byte[] data) + { + DataCallBack(sk, data); + } + + public void DataCallBack(Socket sk, byte[] data) + { + //AppNoSugarNet.log.Debug("收到消息 数据长度=>" + data.Length); + //记录接受长度 + mReciveAllLenght += data.Length; + if (!GetSocketIdxBySocket(sk, out int Idx)) + return; + try + { + if (GetMsgQueueByIdx(sk.Handle, out Queue _queue)) + { + lock (_queue) + { + _queue.Enqueue(data); + while (_queue.Count > 0) + { + AppNoSugarNet.local.OnClientTunnelDataCallBack(mTunnelID, (byte)Idx, _queue.Dequeue()); + } + } + } + + ////抛出网络数据 + //AppNoSugarNet.local.OnClientTunnelDataCallBack(mTunnelID, (byte)Idx, data); + } + catch (Exception ex) + { + Console.WriteLine("逻辑处理错误:" + ex.ToString()); + } + } + + public void CloseConnectByIdx(byte Idx) + { + if (GetSocketByIdx(Idx, out LocalClientInfo _localClientInf)) + { + _localClientInf._socket.Shutdown(SocketShutdown.Both); + } + } + + /// + /// 断开连接 + /// + /// + public void OnDisconnectClient(Socket sk) + { + AppNoSugarNet.log.Debug("断开连接"); + + if (!GetSocketIdxBySocket(sk, out int Idx)) + return; + + AppNoSugarNet.local.OnClientLocalDisconnect(mTunnelID, (byte)Idx); + RemoveDictSocket(sk); + } + + public void OnShowNetLog(string msg) + { + AppNoSugarNet.log.Debug(msg); + } + + #region 一个轻量级无用户连接管理 + Dictionary DictSocketHandle2Idx = new Dictionary(); + Dictionary> DictSocketHandle2Msg = new Dictionary>(); + Dictionary DictIdx2LocalClientInfo = new Dictionary(); + int mSeedIdx = 0; + List FreeIdxs = new List(); + public class LocalClientInfo + { + public Socket _socket; + public bool bRemoteConnect; + public bool bLocalConnect => _socket.Connected; + public Queue msgQueue = new Queue(); + } + + int GetNextIdx() + { + if (FreeIdxs.Count > 0) + { + int Idx = FreeIdxs[0]; + FreeIdxs.RemoveAt(0); + return Idx; + } + return mSeedIdx++; + } + + /// + /// 追加Socket返回下标 + /// + /// + /// + public int AddDictSocket(Socket socket) + { + if (socket == null) + return -1; + lock (DictSocketHandle2Idx) + { + int Idx = GetNextIdx(); + DictSocketHandle2Idx[socket.Handle] = Idx; + DictIdx2LocalClientInfo[Idx] = new LocalClientInfo() { _socket = socket,bRemoteConnect = false}; + DictSocketHandle2Msg[socket.Handle] = new Queue(); + return Idx; + } + } + + public void RemoveDictSocket(Socket socket) + { + if (socket == null) + return; + lock (DictSocketHandle2Idx) + { + if (!DictSocketHandle2Idx.ContainsKey(socket.Handle)) + return; + int Idx = DictSocketHandle2Idx[socket.Handle]; + FreeIdxs.Add(Idx); + if (DictIdx2LocalClientInfo.ContainsKey(Idx)) + DictIdx2LocalClientInfo.Remove(Idx); + + if (DictSocketHandle2Msg.ContainsKey(socket.Handle)) + DictSocketHandle2Msg.Remove(socket.Handle); + + DictSocketHandle2Idx.Remove(socket.Handle); + } + } + + bool GetSocketByIdx(int Idx, out LocalClientInfo _localClientInfo) + { + if (!DictIdx2LocalClientInfo.ContainsKey(Idx)) + { + _localClientInfo = null; + return false; + } + + _localClientInfo = DictIdx2LocalClientInfo[Idx]; + return true; + } + + bool GetMsgQueueByIdx(nint handle, out Queue _queue) + { + if (!DictSocketHandle2Msg.ContainsKey(handle)) + { + _queue = null; + return false; + } + + _queue = DictSocketHandle2Msg[handle]; + return true; + } + + public bool GetSocketIdxBySocket(Socket _socket, out int Idx) + { + if (_socket == null) + { + Idx = -1; + return false; + } + + if (!DictSocketHandle2Idx.ContainsKey(_socket.Handle)) + { + Idx = -1; + return false; + } + + Idx = DictSocketHandle2Idx[_socket.Handle]; + return true; + } + + public bool CheckRemoteConnect(int Idx) + { + if (!GetSocketByIdx(Idx, out LocalClientInfo _localClientInfo)) + return false; + return _localClientInfo.bRemoteConnect; + } + + public void SetRemoteConnectd(int Idx,bool bConnected) + { + if (!GetSocketByIdx(Idx, out LocalClientInfo _localClientInfo)) + return; + if (bConnected) + AppNoSugarNet.log.Debug("远端本地连接已连接!!!!"); + else + AppNoSugarNet.log.Debug("远端本地连接已断开连接!!!!"); + _localClientInfo.bRemoteConnect = bConnected; + } + + public void StopAll() + { + lock (DictIdx2LocalClientInfo) + { + int[] Idxs = DictIdx2LocalClientInfo.Keys.ToArray(); + for (int i = 0; i < Idxs.Length; i++) + { + CloseConnectByIdx((byte)Idxs[i]); + } + DictIdx2LocalClientInfo.Clear(); + } + } + + #endregion + + + #region 缓存 + public void EnqueueIdxWithMsg(byte Idx, byte[] data) + { + if (!GetSocketByIdx(Idx, out LocalClientInfo _localClientInfo)) + return; + + IdxWithMsg Msg = AppNoSugarNet.local._localMsgPool.Dequeue(); + Msg.Idx = Idx; + Msg.data = data; + _localClientInfo.msgQueue.Enqueue(Msg); + } + public bool GetDictMsgQueue(byte Idx,out List MsgList) + { + if (!GetSocketByIdx(Idx, out LocalClientInfo _localClientInfo) || _localClientInfo.msgQueue.Count < 1) + { + MsgList = null; + return false; + } + + MsgList = new List(); + lock (_localClientInfo.msgQueue) + { + while (_localClientInfo.msgQueue.Count > 0) + { + IdxWithMsg msg = _localClientInfo.msgQueue.Dequeue(); + MsgList.Add(msg); + } + return true; + } + } + #endregion + } +} diff --git a/NoSugarNet.ServerCore/NetWork/IOCPNetWork.cs b/NoSugarNet.ServerCore/NetWork/IOCPNetWork.cs index 3706883..f33b821 100644 --- a/NoSugarNet.ServerCore/NetWork/IOCPNetWork.cs +++ b/NoSugarNet.ServerCore/NetWork/IOCPNetWork.cs @@ -33,7 +33,7 @@ namespace ServerCore.NetWork public void DataCallBack(Socket sk, int CMDID, byte[] data) { - //ServerManager.g_Log.Debug("收到消息 CMDID =>" + CMDID + " 数据长度=>" + data.Length); + ServerManager.g_Log.Debug("收到消息 CMDID =>" + CMDID + " 数据长度=>" + data.Length); try { //抛出网络数据 -- 2.36.0.windows.1 From e9fba210a7892fb2739d5d6e3b5ab328fa42e507 Mon Sep 17 00:00:00 2001 From: sin365 <353374337@qq.com> Date: Fri, 29 Mar 2024 18:04:47 +0800 Subject: [PATCH 2/2] .. --- NoSugarNet.ServerCore/NetWork/IOCPNetWork.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NoSugarNet.ServerCore/NetWork/IOCPNetWork.cs b/NoSugarNet.ServerCore/NetWork/IOCPNetWork.cs index f33b821..3706883 100644 --- a/NoSugarNet.ServerCore/NetWork/IOCPNetWork.cs +++ b/NoSugarNet.ServerCore/NetWork/IOCPNetWork.cs @@ -33,7 +33,7 @@ namespace ServerCore.NetWork public void DataCallBack(Socket sk, int CMDID, byte[] data) { - ServerManager.g_Log.Debug("收到消息 CMDID =>" + CMDID + " 数据长度=>" + data.Length); + //ServerManager.g_Log.Debug("收到消息 CMDID =>" + CMDID + " 数据长度=>" + data.Length); try { //抛出网络数据 -- 2.36.0.windows.1