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); } }
/// <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); } }
/// <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 { } }
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); } }
/// <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); } } } } }
/// <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); } } }