/// <summary> /// 关闭连接 /// </summary> /// <param name="linkNo"></param> private void Close(long linkNo) { if (g_cdSockets != null && g_cdSockets.ContainsKey(linkNo)) { ClientSocketModel c = g_cdSockets[linkNo]; c.Close(); g_cdSockets.Remove(linkNo); if (Disconnected != null) { MessageHandler handler = new MessageHandler(); handler.MessageCode = MessageCode.Warming; handler.MessageInfo = string.Format("[{0}] 断开一个客户端套接字,连接编号:{1}", DateTime.Now.ToString("HH:mm:ss"), linkNo); Disconnected(handler); } } if (g_sdSockets != null && g_sdSockets.ContainsKey(linkNo)) { ServerSocketModel s = g_sdSockets[linkNo]; s.Close(); g_sdSockets.Remove(linkNo); if (Disconnected != null) { MessageHandler handler = new MessageHandler(); handler.MessageCode = MessageCode.Warming; handler.MessageInfo = string.Format("[{0}] 断开一个服务器套接字,连接编号:{1}", DateTime.Now.ToString("HH:mm:ss"), linkNo); Disconnected(handler); } } }
/// <summary> /// 发送数据到服务器 /// </summary> /// <param name="linkNo"></param> /// <param name="buffer"></param> private void SendToServer(long linkNo, byte[] buffer) { if (buffer != null && buffer.Length > 0) { if (g_sdSockets != null && g_sdSockets.ContainsKey(linkNo)) { ServerSocketModel serversocket = g_sdSockets[linkNo]; if (serversocket != null && serversocket.Socket != null) { try { SocketError error = SocketError.SocketError; serversocket.Socket.BeginSend(buffer, 0, buffer.Length, SocketFlags.None, out error, (result) => { if (serversocket.Socket != null) { serversocket.Socket.EndSend(result, out error); } else { this.Close(serversocket.LinkNo); } if (error != SocketError.Success) { this.Close(serversocket.LinkNo); } }, null); if (error != SocketError.Success) { this.Close(serversocket.LinkNo); } } catch (Exception) { this.Close(serversocket.LinkNo); } } } } }
private unsafe void RecvServerSocketMethod() { while (!g_exitServerThread) { try { if (g_sListener == null || !g_sListener.Pending()) { Thread.Sleep(1); } else { Socket recvServerSocket = g_sListener.AcceptSocket(); if (recvServerSocket != null) { ServerSocketModel socket = new ServerSocketModel(); socket.LinkNo = LinkNoTool.GetLinkNo(); socket.Socket = recvServerSocket; socket.g_recvHeartTime = DateTime.Now; socket.CleanUp(); lock (g_sdSockets) { g_sdSockets.Add(socket.LinkNo, socket); } Thread recvthread = new Thread(new ParameterizedThreadStart(RecvServerBufferMethod)); recvthread.Start(socket); MessageHandler handler = new MessageHandler(); handler.MessageCode = MessageCode.Success; handler.MessageInfo = string.Format("[{0}] 服务器成功连接,连接编号:{1},ip:[{2}]", DateTime.Now.ToString("HH:mm:ss"), socket.LinkNo, socket.Socket.RemoteEndPoint.ToString()); if (this.Connected != null) { Connected(handler); } } } } catch { } } }
/// <summary> /// 获取服务器套接字缓冲区数据 /// </summary> /// <param name="socket"></param> private unsafe void RecvServerBufferMethod(object socket) { ServerSocketModel serversocket = (ServerSocketModel)socket; if (serversocket != null && serversocket.Socket != null) { while (!g_exitServerThread) { byte[] data = null; int len = 0; try { if (serversocket.Socket == null || serversocket.Socket.Available < serversocket.g_recvWorkSize) { Thread.Sleep(1); } else { len = serversocket.Socket.Receive((serversocket.g_recvWorkHeader == null ? serversocket.Buffer : serversocket.g_recvWorkPacket), serversocket.g_recvWorkOfs, serversocket.g_recvWorkSize, SocketFlags.None); if (serversocket.g_recvWorkHeader == null) { NETWORK_PACKET_HEADER *header = (NETWORK_PACKET_HEADER *)Marshal.UnsafeAddrOfPinnedArrayElement(serversocket.Buffer, 0); if (header->bkey == NETWORK_PACKET_HEADER.STX) { serversocket.g_recvWorkSize = (header->wlen - len); serversocket.g_recvWorkOfs = len; } serversocket.g_recvWorkHeader = *header; serversocket.g_recvWorkPacket = new byte[header->wlen]; Buffer.BlockCopy(serversocket.Buffer, 0, serversocket.g_recvWorkPacket, 0, len); if (serversocket.g_recvWorkSize <= 0) { data = serversocket.CleanUp(); } } else if ((len - serversocket.g_recvWorkSize) <= 0) { data = serversocket.CleanUp(); } } if (serversocket.Socket != null && !serversocket.Connected) { this.Close(serversocket.LinkNo); } } catch { this.Close(serversocket.LinkNo); Thread.CurrentThread.Abort(); } if (data != null) { MessageReceivedEventArgs args = new MessageReceivedEventArgs(); args.Buffer = data; args.Listener = this; args.LocalEP = serversocket.Socket.LocalEndPoint; args.RemoteEP = serversocket.Socket.RemoteEndPoint; args.RecivedType = MessgeRecivedType.ServerMessage; args.LinqNo = serversocket.LinkNo; OnReceived(args); } } } }