void socketLintener_DataReceived(object sender, ConnectionEventArgs e) { var data = Encoding.UTF8.GetString(e.Data); int index = data.LastIndexOf("?d="); if (index > 0) { data = data.Substring(index, data.Length - index); } data = HttpUtility.ParseQueryString(data)["d"]; int gameId, serverId, statuscode; var ip = e.Socket.RemoteEndPoint.ToString().Split(new char[] { ':' })[0]; var requestParam = RequestParse.Parse(ip, "", data, out gameId, out serverId, out statuscode); if (statuscode != (int)HttpStatusCode.OK) {// 接收到非法数据 listener.CloseSocket(e.Socket); return; } ClientConnection clientConnection; if (!clientConnections.TryGetValue(e.Socket, out clientConnection)) { Logger.Warn("接收到不在连接池中的socket数据,哪里有bug。"); listener.CloseSocket(e.Socket); return; } if (clientConnection.GameId == 0) { clientConnection.GameId = gameId; } if (clientConnection.ServerId == 0) { clientConnection.ServerId = serverId; } requestParam["UserHostAddress"] = ip; requestParam["ssid"] = clientConnection.SSID.ToString("N"); requestParam["http"] = "0"; byte[] paramData = Encoding.ASCII.GetBytes(RequestParse.ToQueryString(requestParam)); try { gsConnectionManager.Send(gameId, serverId, paramData); } catch (Exception ex) { Logger.Error("无法连接游服。", ex); var responseData = RequestParse.CtorErrMsg(errmsg, requestParam); SendDataBack(clientConnection.SSID, responseData, 0, responseData.Length); } }
public void CloseSocket() { if (socketListener != null) { socketListener.CloseSocket(); } }
/// <summary> /// 在多个线程内部循环调用 /// </summary> public void ProcessCmdPackets(Queue <CmdPacket> ls) { //dictInPackets.Values值的个数可能会变化,每次处理先保存好最大个数 //同时给出20个冗余数量 int maxCount = dictInPackets.Values.Count + 20; for (int n = 0; n < maxCount; n++) { TCPInPacket tcpInPacket = GetNextTcpInPacket(n); //这意味着列表数据包变少了 if (null == tcpInPacket) { break; } ls.Clear(); if (tcpInPacket.PopCmdPackets(ls)) //判断是否取到了指令列表 { try { while (ls.Count > 0) { CmdPacket cmdPacket = ls.Dequeue(); //接收到了完整的命令包 TCPOutPacket tcpOutPacket = null; TCPProcessCmdResults result = TCPProcessCmdResults.RESULT_FAILED; result = TCPCmdHandler.ProcessCmd(this, tcpInPacket.CurrentSocket, tcpClientPool, tcpRandKey, tcpOutPacketPool, cmdPacket.CmdID, cmdPacket.Data, cmdPacket.Data.Length, out tcpOutPacket); if (result == TCPProcessCmdResults.RESULT_DATA && null != tcpOutPacket) { //向登陆客户端返回数据 socketListener.SendData(tcpInPacket.CurrentSocket, tcpOutPacket); } else if (result == TCPProcessCmdResults.RESULT_FAILED)//解析失败, 直接关闭连接 { if (cmdPacket.CmdID != (int)TCPGameServerCmds.CMD_LOG_OUT) { LogManager.WriteLog(LogTypes.Error, string.Format("解析并执行命令失败: {0},{1}, 关闭连接", (TCPGameServerCmds)tcpInPacket.PacketCmdID, Global.GetSocketRemoteEndPoint(tcpInPacket.CurrentSocket))); } SysConOut.WriteLine("========================ProcessCmdPackets CloseSocket================"); // Console.WriteLine("========================ProcessCmdPackets CloseSocket================"); //这儿需要关闭链接--->这样关闭对吗? socketListener.CloseSocket(tcpInPacket.CurrentSocket); break; } } } finally { //处理结束之后设置相关标志位 tcpInPacket.OnThreadDealingComplete(); } } } }
void socketLintener_DataReceived(object sender, ConnectionEventArgs e) { var data = Encoding.ASCII.GetString(e.Data); try { string routeName = string.Empty; int index = data.LastIndexOf("?d="); if (index > 0) { if (data.StartsWith("route:", StringComparison.CurrentCultureIgnoreCase)) { routeName = data.Substring(6, index - 6); } data = data.Substring(index, data.Length - index); } data = HttpUtility.ParseQueryString(data)["d"]; int gameId, serverId, statuscode; var ip = e.Socket.RemoteEndPoint.ToString().Split(new char[] { ':' })[0]; var requestParam = RequestParse.Parse(ip, "", data, out gameId, out serverId, out statuscode); if (statuscode != (int)HttpStatusCode.OK) {// 接收到非法数据 listener.CloseSocket(e.Socket); return; } ClientConnection clientConnection; if (!clientConnections.TryGetValue(e.Socket, out clientConnection)) { TraceLog.WriteError("接收到不在连接池中的socket数据,哪里有bug。"); listener.CloseSocket(e.Socket); return; } if (clientConnection.GameId == 0) { clientConnection.GameId = gameId; } if (clientConnection.ServerId == 0) { clientConnection.ServerId = serverId; } requestParam["UserHostAddress"] = ip; requestParam["ssid"] = clientConnection.SSID.ToString("N"); requestParam["http"] = "0"; string paramStr = string.Format("{0}&UserHostAddress={1}&ssid={2}&http=0", data, ip, requestParam["ssid"]); if (!string.IsNullOrEmpty(routeName)) { requestParam["route"] = routeName; paramStr += "&route=" + routeName; } byte[] paramData = Encoding.ASCII.GetBytes(paramStr); try { gsConnectionManager.Send(gameId, serverId, paramData); } catch (Exception ex) { TraceLog.WriteError("无法连接游服error:{0}\r\nparam:{1}", ex, paramStr); var responseData = RequestParse.CtorErrMsg(errmsg, requestParam); SendDataBack(clientConnection.SSID, responseData, 0, responseData.Length); } } catch (Exception err) { TraceLog.WriteError("DataReceived error:{0},param:{1}", err, data); } }