public MyUdpRequestInfo Filter(ReceiveCache data, out int rest) { rest = 0; var length = data.Total; if (length <= 40) { return(null); } var key = Encoding.ASCII.GetString(data, 0, 4); var sessionID = Encoding.ASCII.GetString(data, 4, 36); var body = Encoding.UTF8.GetString(data, 40, length - 40); return(new MyUdpRequestInfo(key, sessionID) { Value = body }); }
public StringPackageInfo Filter(ReceiveCache data, out int rest) { rest = data.Total; var current = data.Current; var startByte = current.Array[current.Offset]; if ((startByte & 0x80) == 0x00) //data is fragmented by begin/end mark { rest--; NextReceiveFilter = m_MarkReceiveFilter; } else if (startByte == 0xff) { rest--; NextReceiveFilter = m_CloseMarkReceiveFilter; } else //data is fragmented by length { NextReceiveFilter = m_LenReceiveFilter; } return(null); }
public StringRequestInfo Filter(ReceiveCache data, out int rest) { var current = data.Current; rest = current.Count; var flag = current.Array[current.Offset]; if (flag == m_BeginMarkA) { NextReceiveFilter = m_FilterA; } else if (flag == m_BeginMarkB) { NextReceiveFilter = m_FilterB; } else { State = FilterState.Error; } return(null); }
void ProcessPackageWithSessionID(Socket listenSocket, IPEndPoint remoteEndPoint, ArraySegment <byte> receivedData) { TRequestInfo requestInfo; string sessionID; int rest; try { var receiveData = new ReceiveCache(); receiveData.Add(receivedData); requestInfo = this.m_UdpRequestFilter.Filter(receiveData, out rest); } catch (Exception exc) { if (AppServer.Logger.IsErrorEnabled) { AppServer.Logger.Error("Failed to parse UDP package!", exc); } return; } var udpRequestInfo = requestInfo as UdpRequestInfo; if (rest > 0) { if (AppServer.Logger.IsErrorEnabled) { AppServer.Logger.Error("The output parameter rest must be zero in this case!"); } return; } if (udpRequestInfo == null) { if (AppServer.Logger.IsErrorEnabled) { AppServer.Logger.Error("Invalid UDP package format!"); } return; } if (string.IsNullOrEmpty(udpRequestInfo.SessionID)) { if (AppServer.Logger.IsErrorEnabled) { AppServer.Logger.Error("Failed to get session key from UDP package!"); } return; } sessionID = udpRequestInfo.SessionID; var appSession = AppServer.GetSessionByID(sessionID); if (appSession == null) { if (!DetectConnectionNumber(remoteEndPoint)) { return; } var socketSession = new UdpSocketSession(listenSocket, remoteEndPoint, sessionID); appSession = AppServer.CreateAppSession(socketSession); if (appSession == null) { return; } if (!DetectConnectionNumber(remoteEndPoint)) { return; } if (!AppServer.RegisterSession(appSession)) { return; } Interlocked.Increment(ref m_ConnectionCount); socketSession.Closed += OnSocketSessionClosed; socketSession.Start(); } else { var socketSession = appSession.SocketSession as UdpSocketSession; //Client remote endpoint may change, so update session to ensure the server can find client correctly socketSession.UpdateRemoteEndPoint(remoteEndPoint); } m_RequestHandler.ExecuteCommand(appSession, requestInfo); }