private void OnSocketSend() { NetPacket packet; while (true) { AutoResetEvent sendEvent = sendPool.sendEvent; if (sendEvent.WaitOne(2000)) { if (IsSocketValid() == false) { continue; } try { while (sendPool.HasPacketToSend()) { packet = sendPool.GetSendPacket(); packet.remainTime = cSendTimeout; lock (timeoutPacket) { if (!timeoutPacket.ContainsKey(packet.msgid)) { timeoutPacket.Add(packet.msgid, packet); } else { timeoutPacket[packet.msgid] = packet; } } sendBuffer.Clear(); packet.WriteBuffer(packetSeq++, sendBuffer); var i = m_socket.Send(sendBuffer.BBuffer, sendBuffer.Count, SocketFlags.None); if (LaunchConfigManager.LogEnable("NetManager")) { //LogUtils.LogWarning("Net send", packetSeq - 1, packet.msgid, packet.data.Length, i); } } } catch (ThreadAbortException e) { //忽略Thread.Abort异常 } catch (Exception e) { LogUtils.LogError("Net send error:", e); Close(true); continue; } } } }
public override void DoUpdate() { if (!IsSocketValid()) { return; } removeKey = null; clearBool = false; PluginUtilities.ProfilerBegin("NetManager.DoUpdate"); foreach (var e in timeoutPacket.Keys) { timeoutPacket[e].remainTime -= Time.unscaledDeltaTime; if (timeoutPacket[e].remainTime <= 0) { if (OnProcessTimeout(e, timeoutPacket[e])) { clearBool = true; break; } else { removeKey = e; break; } } } if (clearBool) { timeoutPacket.Clear(); } else if (removeKey != null) { timeoutPacket.Remove(removeKey.Value); } NetPacket packet = null; while ((packet = recvPool.GetRecvPacket()) != null) { if (LaunchConfigManager.LogEnable("NetManager")) { //LogUtils.LogWarning("Net recv, cmd =", packet.msgid, "len = ", packet.data.Length); } DispatchCmdEvent(packet); } PluginUtilities.ProfilerEnd(); }
private void OnSocketReceive() { while (true) { int count = 0; tempBuffer.Clear(); connectEvent.WaitOne(); try { //发热修改:socket.Available <= 0 || (count = socket.Receive(tempBuffer.BBuffer)) < 0 会导致receive不会block的情况 if ((count = m_socket.Receive(tempBuffer.BBuffer)) < 0) { //Disconnect(); continue; } tempBuffer.Count = count; buffer.Append(tempBuffer); while (buffer.CanReadInt32()) { var len = buffer.ReadInt32(); if (buffer.Available >= len) { var packet = new NetPacket(); packet.ReadBuffer(buffer, len); if (LaunchConfigManager.LogEnable("NetManager")) { //LogUtils.LogWarning($"Net read num = {packet.number} cmd = {packet.cmd} zip = {packet.zip} len = {len}"); } recvPool.AddRecvPacket(packet); buffer.TruncateRead(); } else { if (LaunchConfigManager.LogEnable("NetManager")) { // LogUtils.LogWarning($"Net read out of bound, do revert"); } buffer.RevertLastRead(); break; } } } catch (SocketException e) { LogUtils.LogError($"Socket error : {e.SocketErrorCode} {e.ToString()}"); Close(m_socket, true); closeEvent.Set(); connectEvent.Reset(); } catch (ThreadAbortException e) { //忽略Thread.Abort异常 Close(m_socket, true); closeEvent.Set(); connectEvent.Reset(); } catch (Exception e) { LogUtils.LogError("Socket error : ", e); Close(m_socket, true); closeEvent.Set(); connectEvent.Reset(); } //Thread.Sleep(100); } }