コード例 #1
0
ファイル: SocketProxy.cs プロジェクト: dongliang/Scut
        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();
     }
 }
コード例 #3
0
ファイル: TCPManager.cs プロジェクト: chenchungit/ky
        /// <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();
                    }
                }
            }
        }
コード例 #4
0
        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);
            }
        }