public void Close(bool rightNow = true) { if (!rightNow) { // if there are some messages still waiting for sending, delay the closing action if (m_OutgoingMessageQueue.Count > 0 || m_IncomingMessageQueue.Count > 0) { m_IsGoingToClose = true; return; } } if (m_State > 0) { // when state is changed from "connected" to "disconnected", fire the event. // please note that now the socket is (probably) still connecting and the session is still in group. if (m_IoHandler != null) { try { m_IoHandler.OnDisconnect(this); } catch { } } } if (m_Stream != null) { m_State = 0; try { m_Stream.Close(); } catch { } try { m_Stream.Dispose(); } catch { } m_State = -1; m_Stream = null; } else { m_State = -1; m_Stream = null; } try { // clean up the queue if (m_OutgoingMessageQueue.Count > 0) { lock (m_OutgoingMessageQueue) m_OutgoingMessageQueue.Clear(); } // clean up the queue if (m_IncomingMessageQueue.Count > 0) { m_IncomingMessageQueue.Clear(); // incoming data should be processed in single thread } m_Attributes.Clear(); } catch { } m_IsGoingToClose = false; if (m_SessionGroup != null) { // finally, remove it from group ... m_SessionGroup.RemoveSession(m_Id); } }
public void ReceiveIncomingMessages() { byte networkError; int connectionId; int channelId; int receivedSize; NetworkEventType networkEvent; if (HostId >= 0 && NetworkEventHandler != null) { do { networkEvent = NetworkTransport.ReceiveFromHost(HostId, out connectionId, out channelId, NetBuffer.InternalBuffer, NetBuffer.InternalBuffer.Length, out receivedSize, out networkError); switch (networkEvent) { case NetworkEventType.ConnectEvent: if ((NetworkError)networkError == NetworkError.Ok) { if (Mode == OnlineSessionMode.Server) { ClientConnections.Add(new ClientConnection(connectionId)); } else if (Mode == OnlineSessionMode.Client) { ServerConnection = connectionId; } NetworkEventHandler.OnConnect(connectionId); } break; case NetworkEventType.DisconnectEvent: if (Mode == OnlineSessionMode.Server) { for (int i = ClientConnections.Count - 1; i >= 0; i--) { if (ClientConnections[i].ConnectionId == connectionId) { ClientConnections.RemoveAt(i); break; } } } else if (Mode == OnlineSessionMode.Client) { ServerConnection = -1; } NetworkEventHandler.OnDisconnect(connectionId); if (Mode == OnlineSessionMode.Client) { TerminateNetworking(); } break; case NetworkEventType.DataEvent: if ((NetworkError)networkError == NetworkError.Ok) { NetworkEventHandler.OnData(connectionId, channelId, receivedSize); } break; } }while (networkEvent != NetworkEventType.Nothing); } }