From 51b0f6ed9f4e1d3bb6f8144470b46908c7699a96 Mon Sep 17 00:00:00 2001
From: yyl <yyl>
Date: 星期一, 11 五月 2026 16:20:37 +0800
Subject: [PATCH] Merge branch 'master' into h5version

---
 Main/Core/NetworkPackage/Socket/ClientSocket.cs |   89 +++++++++++++++++++++++++++++++++++++-------
 1 files changed, 75 insertions(+), 14 deletions(-)

diff --git a/Main/Core/NetworkPackage/Socket/ClientSocket.cs b/Main/Core/NetworkPackage/Socket/ClientSocket.cs
index 12a16c2..f2fa088 100644
--- a/Main/Core/NetworkPackage/Socket/ClientSocket.cs
+++ b/Main/Core/NetworkPackage/Socket/ClientSocket.cs
@@ -32,6 +32,7 @@
     // WebSocket 瀹炵幇锛圵ebGL骞冲彴锛�
     WebSocket webSocket;
     public WebSocket socket { get { return webSocket; } }
+    private byte[] fragmentBytes; // TCP-to-WS缃戝叧鎸塗CP缂撳啿鍖烘媶鍖咃紝闇�瑕佽法娑堟伅閲嶇粍
 #endif
 
     public Action OnDisconnected;
@@ -75,11 +76,13 @@
 
     public void Connect(string _ip, int _port, Action<bool> _onConnected)
     {
+        Debug.unityLogger.logEnabled = true;
         try
         {
             ip = _ip;
             port = _port;
             onConnected = _onConnected;
+            Debug.Log($"[ClientSocket][Connect] 灏濊瘯杩炴帴: ip={_ip}, port={_port}");
             //鐩墠娴嬭瘯鍒板紓姝ヤ袱涓棶棰�
             // 1. BeginGetHostAddresses 涓嶆槑鎯呭喌涓嬩細寰堜箙鎵嶅洖璋冿紝瀵艰嚧瑙﹀彂瓒呮椂
             // 2. 瓒呮椂鐨勬儏鍐典笅澶氭灏濊瘯鐧诲綍鍚庯紝浼氳Е鍙戝娆nGetHostAddresses锛屽鑷寸櫥褰曞紓甯�
@@ -95,29 +98,29 @@
             ipAddress = ipAddresses[0];
 #endif
 
-
+            Debug.Log($"[ClientSocket][Connect] 瑙f瀽鍒癷pAddress={ipAddress}, family={ipAddress.AddressFamily}");
             if (ipAddress.AddressFamily == AddressFamily.InterNetworkV6)
             {
-                Debug.Log("褰撳墠浣跨敤鐨勭綉缁�: IPV6");
+                Debug.Log("[ClientSocket][Connect] 褰撳墠浣跨敤鐨勭綉缁�: IPV6");
                 m_Socket = new Socket(AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp);
             }
             else
             {
-                Debug.Log("褰撳墠浣跨敤鐨勭綉缁�: IPV4");
+                Debug.Log("[ClientSocket][Connect] 褰撳墠浣跨敤鐨勭綉缁�: IPV4");
                 m_Socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
             }
 
             var ipEndPoint = new IPEndPoint(ipAddress, port);
             if (ipEndPoint == null)
             {
-                Debug.Log("IpEndPoint is null");
+                Debug.LogError("[ClientSocket][Connect] IpEndPoint is null");
             }
 
             m_Socket.BeginConnect(ipEndPoint, new AsyncCallback(ConnectCallBack), null);
         }
         catch (Exception e)
         {
-            Debug.LogError(e.Message);
+            Debug.LogError($"[ClientSocket][Connect] 寮傚父: {e.Message}");
         }
 
 
@@ -153,12 +156,14 @@
     /// <param name="_result"></param>
     private void ConnectCallBack(IAsyncResult _result)
     {
+        Debug.unityLogger.logEnabled = true;
         if (!_result.IsCompleted)
         {
-            Debug.Log("閾炬帴瓒呮椂锛�");
+            Debug.LogError("[ClientSocket][ConnectCallBack] 閾炬帴瓒呮椂锛�");
             CloseConnect();
             if (onConnected != null)
             {
+                Debug.LogError("[ClientSocket][ConnectCallBack] onConnected(false) 瓒呮椂");
                 onConnected(false);
                 onConnected = null;
             }
@@ -169,11 +174,12 @@
             {
                 if (m_Socket != null && m_Socket.Connected)
                 {
-                    Debug.Log("纭鐨勯摼鎺ュ疄鐜�");
+                    Debug.Log("[ClientSocket][ConnectCallBack] 纭鐨勯摼鎺ュ疄鐜�");
                     OnConnectSuccess();
                 }
                 else
                 {
+                    Debug.LogError("[ClientSocket][ConnectCallBack] m_Socket涓簄ull鎴栨湭杩炴帴");
                     if (m_Socket != null)
                     {
                         m_Socket.Disconnect(true);
@@ -182,12 +188,13 @@
             }
             catch (System.Exception ex)
             {
-                Debug.Log(ex);
+                Debug.LogError($"[ClientSocket][ConnectCallBack] 寮傚父: {ex}");
             }
             finally
             {
                 if (onConnected != null)
                 {
+                    Debug.Log($"[ClientSocket][ConnectCallBack] onConnected({m_Socket != null && m_Socket.Connected})");
                     onConnected(m_Socket != null && m_Socket.Connected);
                     onConnected = null;
                 }
@@ -204,17 +211,21 @@
     public void CloseConnect()
     {
         Debug.Log("==== CloseConnect");
+        Debug.unityLogger.logEnabled = true;
+        Debug.Log("[ClientSocket][CloseConnect] ==== CloseConnect");
         try
         {
             isStopTreading = true;
             if (m_packageThread != null)
             {
                 m_packageThread.Abort();
+                m_packageThread = null;
             }
         }
         catch (System.Exception ex)
         {
             Debug.Log(ex);
+            m_packageThread = null;
         }
 
         try
@@ -241,15 +252,19 @@
     {
         if (m_packageThread != null)
         {
+            Debug.LogWarning("[ClientSocket][OnConnectSuccess] m_packageThread宸插瓨鍦紝鍏圓bort");
             m_packageThread.Abort();
             m_packageThread = null;
         }
 
+        fragmentBytes = null; // 娓呴櫎涓婃杩炴帴娈嬬暀鐨勭鐗囩紦瀛�
         m_LastPackageTime = DateTime.Now;
+        isStopTreading = false;
         m_packageThread = new Thread(new ThreadStart(ReceiveInfo)); // 鍚姩绾跨▼鎺ユ敹淇℃伅
         m_packageThread.IsBackground = true;
         m_packageThread.Start();
-        isStopTreading = false;
+        Debug.unityLogger.logEnabled = true;
+        Debug.Log("[ClientSocket][OnConnectSuccess] 杩炴帴鎴愬姛锛屽惎鍔ㄦ帴鏀剁嚎绋�");
     }
 
     /// <summary>
@@ -257,6 +272,8 @@
     /// </summary>
     private void ReceiveInfo()
     {
+        Debug.unityLogger.logEnabled = true;
+        Debug.Log("[ClientSocket][ReceiveInfo] 鎺ユ敹绾跨▼鍚姩");
         while (!isStopTreading)
         {
             try
@@ -264,14 +281,17 @@
                 var shutdown = false;
                 if (!m_Socket.Connected)
                 {
+                    Debug.LogWarning("[ClientSocket][ReceiveInfo] m_Socket 宸叉柇寮�");
                     shutdown = true;
                 }
 
                 if (!shutdown)
                 {
                     var dataLength = m_Socket.Receive(bufferBytes);
+                    Debug.Log($"[ClientSocket][ReceiveInfo] 鏀跺埌鏁版嵁闀垮害: {dataLength}");
                     if (dataLength <= 0)
                     {
+                        Debug.LogWarning("[ClientSocket][ReceiveInfo] dataLength <= 0锛屽噯澶囨柇寮�");
                         shutdown = true;
                     }
                     else
@@ -285,6 +305,7 @@
 
                 if (shutdown)
                 {
+                    Debug.LogWarning("[ClientSocket][ReceiveInfo] shutdown=true锛屽叧闂璖ocket");
                     isStopTreading = true;
                     m_Socket.Shutdown(SocketShutdown.Both);
                     m_Socket.Close();
@@ -292,9 +313,10 @@
             }
             catch (Exception e)
             {
-                Debug.Log(e);
+                Debug.LogError($"[ClientSocket][ReceiveInfo] 寮傚父: {e}");
             }
         }
+        Debug.Log("[ClientSocket][ReceiveInfo] 鎺ユ敹绾跨▼閫�鍑�");
 
     }
 
@@ -311,6 +333,7 @@
             if (fragmentBytes != null && fragmentBytes.Length > 0)
             {
                 Array.Resize(ref fixBytes, vBytes.Length + fragmentBytes.Length);
+                Debug.Log($"[ClientSocket][ReadInfo] 瀛樺湪fragmentBytes, 闀垮害: {fragmentBytes.Length}");
                 Array.Copy(fragmentBytes, 0, fixBytes, 0, fragmentBytes.Length);
                 Array.Copy(vBytes, 0, fixBytes, fragmentBytes.Length, vBytes.Length);
             }
@@ -332,9 +355,21 @@
                     Array.Copy(fixBytes, vReadIndex, fragmentBytes, 0, vLeavingLeng);
                     break;
                 }
+                // 鎵撳嵃鍖呭ご鍘熷瀛楄妭锛屼究浜庢帓鏌� OverflowException
+                byte h0 = fixBytes[vReadIndex], h1 = fixBytes[vReadIndex + 1],
+                     h2 = fixBytes[vReadIndex + 2], h3 = fixBytes[vReadIndex + 3],
+                     h4 = fixBytes[vReadIndex + 4], h5 = fixBytes[vReadIndex + 5];
                 vBodyLeng = BitConverter.ToInt32(fixBytes, vReadIndex + 2);
+                Debug.Log($"[ClientSocket][ReadInfo] vReadIndex={vReadIndex} vTotalLeng={vTotalLeng} vLeavingLeng={vLeavingLeng} header=[{h0:X2} {h1:X2} {h2:X2} {h3:X2} {h4:X2} {h5:X2}] vBodyLeng={vBodyLeng}");
+                if (vBodyLeng < 0)
+                {
+                    Debug.LogError($"[ClientSocket][ReadInfo] vBodyLeng寮傚父({vBodyLeng})锛屼涪寮冨墿浣欐暟鎹紒fragmentBytes鎬婚暱={fixBytes.Length} vReadIndex={vReadIndex}");
+                    fragmentBytes = null;
+                    break;
+                }
                 if (vBodyLeng > vLeavingLeng - 6)// 鏈畬鏁寸殑鍖呭垯鐣欏寘
                 {
+                    Debug.Log($"[ClientSocket][ReadInfo] 鍖呬笉瀹屾暣锛岀暀鍖�: vBodyLeng={vBodyLeng} vLeavingLeng={vLeavingLeng}");
                     fragmentBytes = new byte[vLeavingLeng];
                     Array.Copy(fixBytes, vReadIndex, fragmentBytes, 0, vLeavingLeng);
                     break;
@@ -438,6 +473,7 @@
     
     public async void Connect(string _ip, int _port, Action<bool> _onConnected)
     {
+        Debug.unityLogger.logEnabled = true;
         ip = _ip;
         port = _port;
         onConnected = _onConnected;
@@ -489,8 +525,16 @@
         {
             getBytesTotal += data.Length;
             
-            // WebSocket鏄秷鎭ā寮忥紝姣忔鏀跺埌瀹屾暣鍖咃紝鐩存帴澶勭悊
             byte[] fixBytes = data;
+            // TCP-to-WS缃戝叧鎸塗CP缂撳啿鍖哄ぇ灏忔媶鍒嗭紝闇�璺ㄦ秷鎭噸缁勶紙涓嶵CP ReadInfo閫昏緫涓�鑷达級
+            if (fragmentBytes != null && fragmentBytes.Length > 0)
+            {
+                fixBytes = new byte[fragmentBytes.Length + data.Length];
+                Array.Copy(fragmentBytes, 0, fixBytes, 0, fragmentBytes.Length);
+                Array.Copy(data, 0, fixBytes, fragmentBytes.Length, data.Length);
+            }
+            fragmentBytes = null;
+
             int vReadIndex = 0;
             byte[] vPackBytes;
             int vLeavingLeng = 0;
@@ -503,14 +547,30 @@
                 vLeavingLeng = vTotalLeng - vReadIndex;
                 if (vLeavingLeng < 6)
                 {
-                    Debug.LogError($"[ClientSocket-WebSocket] 鍖呮暟鎹笉瓒�: {vLeavingLeng} bytes");
+                    fragmentBytes = new byte[vLeavingLeng];
+                    Array.Copy(fixBytes, vReadIndex, fragmentBytes, 0, vLeavingLeng);
+                    break;
+                }
+                
+                // 鏍¢獙FFCC鍖呭ご锛岄槻姝㈡暟鎹敊浣�
+                if (fixBytes[vReadIndex] != 0xFF || fixBytes[vReadIndex + 1] != 0xCC)
+                {
+                    Debug.LogError($"[ClientSocket-WebSocket] FFCC鍖呭ご寮傚父: {fixBytes[vReadIndex]:X2} {fixBytes[vReadIndex + 1]:X2}, 涓㈠純鍓╀綑 {vLeavingLeng} 瀛楄妭");
+                    fragmentBytes = null;
                     break;
                 }
                 
                 vBodyLeng = BitConverter.ToInt32(fixBytes, vReadIndex + 2);
+                if (vBodyLeng <= 0)
+                {
+                    Debug.LogError($"[ClientSocket-WebSocket] 鍖呬綋闀垮害闈炴硶: {vBodyLeng}, 涓㈠純");
+                    fragmentBytes = null;
+                    break;
+                }
                 if (vBodyLeng > vLeavingLeng - 6)
                 {
-                    Debug.LogError($"[ClientSocket-WebSocket] 鍖呴暱搴︿笉鍖归厤: 澹版槑 {vBodyLeng + 6}, 瀹為檯 {vLeavingLeng}");
+                    fragmentBytes = new byte[vLeavingLeng];
+                    Array.Copy(fixBytes, vReadIndex, fragmentBytes, 0, vLeavingLeng);
                     break;
                 }
                 
@@ -572,7 +632,8 @@
     
     public async void CloseConnect()
     {
-        Debug.Log("[ClientSocket-WebSocket] ==== CloseConnect");
+        Debug.Log("[ClientSocket-WebSocket] ==== CloseConnect\n" + System.Environment.StackTrace);
+        fragmentBytes = null;
         
         if (webSocket != null)
         {

--
Gitblit v1.8.0