Example #1
0
        private static void Downline(onezl.iocp.AsyncSocketUserToken SocketArg)
        {
            var ipstr = SocketArg.IpportStr;
            var aaaa  = new byte[0];

            websocketdatecahe.TryRemove(SocketArg.IpportStr, out aaaa);
            Console.WriteLine("掉线客户端:" + ipstr);

            if (userip.ContainsKey(ipstr))
            {
                foreach (var item in userlist)
                {
                    if (item.Key != userip[ipstr])
                    {
                        DataFrame dfff = new DataFrame("用户:" + userip[ipstr] + "已经掉线");
                        socketserver.PushSendQue(item.Value, dfff.GetBytes());
                        DataFrame dfff1 = new DataFrame("userlist," + string.Join(",", userlist.Select(a => a.Key).Where(b => b != userip[ipstr])));
                        socketserver.PushSendQue(item.Value, dfff1.GetBytes());
                    }
                }
                var o = new SocketAsyncEventArgs();
                userlist.TryRemove(userip[ipstr], out o);
                var stemp = "";
                userip.TryRemove(ipstr, out stemp);
            }
        }
Example #2
0
        /// <summary>关闭socket连接
        /// </summary>
        /// <param name="e">SocketAsyncEventArg associated with the completed send/receive operation.</param>



        //系统放置约定命令
        private void PutEnqueueItemBySys(SocketAsyncEventArgs e, string ipport, string issystemorder)
        {
            try
            {
                AsyncSocketUserToken asyncUserToken = null;

                byte[] oldByteArr = new byte[0];

                asyncUserToken = GetAcceptSoc();


                int socketHandle = (e.UserToken as Socket).Handle.ToInt32();
                asyncUserToken.ConnectSocketHandle = socketHandle;
                asyncUserToken.ReceiveBuffer       = oldByteArr;// //系统标识不粘包; newByteArr;//释放命令
                asyncUserToken.ReceiveEventArgs    = e;
                asyncUserToken.IpportStr           = ipport;

                int revInt = ((socketHandle % 160) / 4);
                asyncUserToken.QueueId = revInt;



                //系统标识
                asyncUserToken.issystemorder = issystemorder;
                _workQueueList[revInt].EnqueueItem(asyncUserToken);//加入队列

                //创建释放粘包缓冲区的队列--end
            }
            catch (Exception exp)
            {
                Logger.WriteLog("PutEnqueueItemBySys exp:" + exp.Message);
            }
        }
 public void Push(AsyncSocketUserToken item)
 {
     if (item == null)
     {
         //throw new ArgumentException("cannot be null");
     }
     lock (m_pool)
     {
         m_pool.Push(item);
     }
 }
Example #4
0
        /// <summary>
        /// 连接掉线处理,处理000505系统命令
        /// </summary>
        /// <param name="sck"></param>
        private void ConnectDown(AsyncSocketUserToken sck)
        {
            this.CleandicBuffer(sck.QueueId, sck.IpportStr);//清空粘包缓存区

            try
            {
                DateTime dt = new DateTime();
                _zombieSocketAsyncEventArgsDic.TryRemove(sck.ReceiveEventArgs, out dt);
            }
            catch
            {
            }
        }
Example #5
0
        private static void myfuncion(onezl.iocp.AsyncSocketUserToken SocketArg, byte[] byteArr)
        {
            // socketserver.ShutdownSocket(SocketArg.ReceiveEventArgs.UserToken as Socket, SocketArg.ReceiveEventArgs);//-------掉线操作

            try
            {
                if (byteArr.Length < 1)
                {
                    return;
                }
                //连接

                //socketserver.PushSendQue(SocketArg.ReceiveEventArgs, Encoding.UTF8.GetBytes("HTTP/1.1 200 OK\r\nContent-Type:text/html;charset=utf-8\r\nContent-Length:18\r\n\r\nWelcome to tinyweb"));
                //   return;

                // Console.WriteLine("queueid:" + SocketArg.QueueId);
                string strAll = Encoding.UTF8.GetString(byteArr);

                //Console.WriteLine(strAll);

                string commandStr = "";
                if (strAll.Length > 5)
                {
                    commandStr = strAll.Substring(0, 6);
                }
                string   str  = strAll.Substring(6);
                string[] strs = str.Split(new string[] { "[f.ff]" }, StringSplitOptions.RemoveEmptyEntries);


                switch (commandStr)
                {
                case "000001"://注册身份命令 001[f.f]黎明

                    socketserver.RemoveZombieSocketAsyncEventArgs(SocketArg.ReceiveEventArgs);
                    break;



                case "001"://注册身份命令 001[f.f]黎明

                    socketserver.PushSendQue(SocketArg.ReceiveEventArgs, Encoding.UTF8.GetBytes("你好"));
                    //不用占包,toserver内部处理

                    break;

                default:


                    #region Sec-WebSocket-Key WebSocketConnect


                    if (strAll.Contains("Sec-WebSocket-Key"))
                    {
                        //socketserver.PushSendQue(SocketArg.ReceiveEventArgs, Encoding.UTF8.GetBytes("HTTP/1.1 101 Switching Protocols\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept:xsOSgr30aKL2GNZKNHKmeT1qYjA = "));

                        string header = strAll;

                        try
                        {
                            Regex webSocketKeyRegex     = new Regex("Sec-WebSocket-Key: (.*)");
                            Regex webSocketVersionRegex = new Regex("Sec-WebSocket-Version: (.*)");

                            // check the version. Support version 13 and above
                            const int WebSocketVersion    = 13;
                            int       secWebSocketVersion = Convert.ToInt32(webSocketVersionRegex.Match(header).Groups[1].Value.Trim());
                            if (secWebSocketVersion < WebSocketVersion)
                            {
                                //throw new WebSocketVersionNotSupportedException(string.Format("WebSocket Version {0} not suported. Must be {1} or above", secWebSocketVersion, WebSocketVersion));
                            }

                            string secWebSocketKey = webSocketKeyRegex.Match(header).Groups[1].Value.Trim();



                            SHA1   sha1               = new SHA1CryptoServiceProvider();
                            byte[] bytes_sha1_in      = Encoding.UTF8.GetBytes(secWebSocketKey + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11");
                            byte[] bytes_sha1_out     = sha1.ComputeHash(bytes_sha1_in);
                            string str_sha1_out       = Convert.ToBase64String(bytes_sha1_out);
                            string setWebSocketAccept = str_sha1_out;


                            string response = ("HTTP/1.1 101 Switching Protocols" + Environment.NewLine
                                               + "Connection: Upgrade" + Environment.NewLine
                                               + "Upgrade: websocket" + Environment.NewLine
                                               + "Sec-WebSocket-Accept: " + setWebSocketAccept + Environment.NewLine + Environment.NewLine);
                            // Console.WriteLine(response);
                            socketserver.PushSendQue(SocketArg.ReceiveEventArgs, Encoding.UTF8.GetBytes(response));
                            return;
                        }


                        catch (Exception ex)
                        {
                            Console.WriteLine("default case exp:" + ex.Message);
                        }

                        return;
                    }
                    #endregion



                    if (!websocketdatecahe.ContainsKey(SocketArg.IpportStr))
                    {
                        websocketdatecahe.TryAdd(SocketArg.IpportStr, byteArr);
                    }
                    else
                    {
                        websocketdatecahe[SocketArg.IpportStr] = CombomBinaryArray(websocketdatecahe[SocketArg.IpportStr], byteArr);
                    }



                    List <string> slist = AnalyzeClientData(SocketArg.IpportStr);
                    foreach (var s in slist)
                    {
                        string messageReceived = string.Empty;

                        if (s.Trim().StartsWith("name:") && s.Trim().Length > 5)
                        {
                            var name = s.Trim().Substring(5);
                            if (userlist.ContainsKey(name))
                            {
                                DataFrame dfff = new DataFrame("你注册的用户名已存在,请换个名字试试!");

                                socketserver.PushSendQue(SocketArg.ReceiveEventArgs, dfff.GetBytes());
                                continue;
                            }
                            else
                            {
                                if (userip.ContainsKey(SocketArg.IpportStr))//已经注册过
                                {
                                    DataFrame dfff = new DataFrame("你已经注册过用户名,你的用户名为:" + userip[SocketArg.IpportStr]);

                                    socketserver.PushSendQue(SocketArg.ReceiveEventArgs, dfff.GetBytes());
                                    continue;
                                }
                                socketserver.RemoveZombieSocketAsyncEventArgs(SocketArg.ReceiveEventArgs);
                                userlist.TryAdd(name, SocketArg.ReceiveEventArgs);
                                userip.TryAdd(SocketArg.IpportStr, name);

                                foreach (var item in userlist.Values)
                                {
                                    DataFrame dfff = new DataFrame("用户:" + name + "已经登录");
                                    socketserver.PushSendQue(item, dfff.GetBytes());

                                    DataFrame dfff1 = new DataFrame("userlist," + string.Join(",", userlist.Select(a => a.Key)));
                                    socketserver.PushSendQue(item, dfff1.GetBytes());
                                }
                            }
                            continue;
                        }

                        string fromname = "未知用户";
                        if (userip.ContainsKey(SocketArg.IpportStr))
                        {
                            fromname = userip[SocketArg.IpportStr];
                        }

                        if (s.Trim().StartsWith("@") && s.Trim().Length > 1)
                        {
                            var name    = s.Trim();
                            var toname  = "";
                            var content = "";
                            if (name.IndexOf(" ") > -1)
                            {
                                toname  = name.Substring(1, name.IndexOf(" ") - 1);
                                content = name.Replace("@" + toname + " ", "");
                            }
                            else
                            {
                                toname = name.Substring(1);
                            }
                            if (userlist.ContainsKey(toname))
                            {
                                DataFrame dfff = new DataFrame("消息来自:" + fromname + ",内容:" + content);

                                socketserver.PushSendQue(userlist[toname], dfff.GetBytes());

                                DataFrame dfff2 = new DataFrame("消息\"" + content + "\"已发送给" + toname + "!");

                                socketserver.PushSendQue(SocketArg.ReceiveEventArgs, dfff2.GetBytes());
                                continue;
                            }
                            else
                            {
                                DataFrame dfff = new DataFrame("你发送的对象不在线!");

                                socketserver.PushSendQue(SocketArg.ReceiveEventArgs, dfff.GetBytes());
                            }


                            continue;
                        }

                        if (s.Trim() != "")
                        {
                            foreach (var item in userlist.Values)
                            {
                                DataFrame dfff = new DataFrame("消息来自:" + fromname + ",内容:" + s);
                                socketserver.PushSendQue(item, dfff.GetBytes());
                            }
                        }
                    }



                    //---------------------------

                    break;
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("exp ssss" + ex.Message);
            }
        }
Example #6
0
        /// <summary>接收数据后的处理
        /// </summary>
        /// <param name="e"></param>
        private void HandelRecive()
        {
            while (true)
            {
                if (_reciveCon == null || _reciveCon.Count == 0)
                {
                    Thread.Sleep(1);
                }
                else
                {
                    SocketAsyncEventArgs e = null;
                    lock (_reciveCon)
                    {
                        e = _reciveCon.Dequeue();
                    }
                    if (e != null)
                    {
                        try
                        {
                            Socket s = (Socket)e.UserToken;
                            if (e.BytesTransferred > 0)
                            {
                                string ipport = s.RemoteEndPoint.ToString();
                                if (e.SocketError == SocketError.Success)
                                {
                                    AsyncSocketUserToken asyncUserToken = this.GetAcceptSoc();

                                    int socketHandle = s.Handle.ToInt32();
                                    asyncUserToken.ConnectSocketHandle = socketHandle;
                                    asyncUserToken.ReceiveBuffer       = new byte[e.BytesTransferred];
                                    Array.Copy(e.Buffer, 0, asyncUserToken.ReceiveBuffer, 0, e.BytesTransferred);
                                    asyncUserToken.ReceiveEventArgs = e;
                                    asyncUserToken.IpportStr        = ipport;
                                    int revInt = ((socketHandle % 160) / 4);
                                    asyncUserToken.QueueId = revInt;
                                    //收到的消息直接加入到队列里
                                    _workQueueList[revInt].EnqueueItem(asyncUserToken);


                                    e.SetBuffer(0, bufferSize);

                                    if (!s.ReceiveAsync(e)) //为接收下一段数据,投递接收请求,这个函数有可能同步完成,这时返回false,并且不会引发SocketAsyncEventArgs.Completed事件
                                    {
                                        // 同步接收时处理接收完成事件
                                        this.ProcessReceive(e);
                                    }
                                }
                                else
                                {
                                    this.ProcessError(e);
                                }
                            }
                            else//客户端主动断开 或者 客户端未断开连接而服务器端主动断开。
                            {
                                this.ProcessError(e);
                            }
                        }
                        catch (Exception ex)
                        {
                            Logger.WriteLog("HandelRecive报的错:" + ex.Message);
                        }
                    }
                }
            }
        }
Example #7
0
        /// <summary> 处理接收队列中的消息
        /// </summary>
        /// <param name="obj">队列约定编号</param>
        private void DoWorkForQueue(object obj)
        {
            int workQueueIndex = Convert.ToInt32(obj);
            WorkQueue <AsyncSocketUserToken> que = _workQueueList[workQueueIndex];

            while (true)
            {
                try
                {
                    if (que.GetQueeuCount() > 0)
                    {
                        AsyncSocketUserToken asyncUserToken = que.DequeueItem();
                        if (asyncUserToken != null)
                        {
                            // List<byte[]> listcompletebt = StickingBag.MakeStickingBag(asyncUserToken.ReceiveBuffer, asyncUserToken.IpportStr, GetDicBuffer(asyncUserToken.QueueId));

#if zhanbao
                            try
                            {
                                switch (asyncUserToken.issystemorder)
                                {
                                case "0":
                                    List <byte[]> listcompletebt = StickingBag.MakeStickingBag(asyncUserToken.ReceiveBuffer, asyncUserToken.IpportStr, GetDicBuffer(asyncUserToken.QueueId));
                                    for (int i = 0; i < listcompletebt.Count; i++)
                                    {
                                        if (ReceiveEvent != null)
                                        {
                                            try
                                            {
                                                ReceiveEvent(asyncUserToken, listcompletebt[i]);
                                            }
                                            catch (Exception ex)
                                            {
                                                Logger.WriteLog("DoWorkForQueue677:" + ex.Message);
                                            }
                                        }
                                    }

                                    break;

                                case "downline":
                                    ConnectDown(asyncUserToken);//清空粘包缓存区,和僵尸连接
                                    DownLineEvent(asyncUserToken);
                                    break;

                                case "newconnect":
                                    this.CleandicBuffer(asyncUserToken.QueueId, asyncUserToken.IpportStr);//清空粘包缓存区
                                    break;

                                default:
                                    break;
                                }
                            }
                            catch (Exception exzhanbao)
                            {
                                Logger.WriteLog("DoWorkForQueue exzhanbao exp:" + exzhanbao.Message);
                            }
#endif



#if buzhanbao
                            try
                            {
                                switch (asyncUserToken.issystemorder)
                                {
                                case "0":
                                    ReceiveEvent(asyncUserToken, asyncUserToken.ReceiveBuffer);
                                    break;

                                case "downline":
                                    ConnectDown(asyncUserToken);//清空粘包缓存区
                                    DownLineEvent(asyncUserToken);
                                    break;

                                case "newconnect":
                                    this.CleandicBuffer(asyncUserToken.QueueId, asyncUserToken.IpportStr);//清空粘包缓存区
                                    break;

                                default:
                                    break;
                                }
                            }
                            catch (Exception ex)
                            {
                                Logger.WriteLog("DoWorkForQueue677:" + ex.Message);
                            }
#endif
                        }
                    }
                    else
                    {
                        Thread.Sleep(10);
                    }
                }
                catch (Exception ex)
                {
                    Logger.WriteLog("DoWorkForQueue:" + ex.Message);
                }
            }
        }