Пример #1
0
        /// <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);
                }
            }
        }
Пример #2
0
 /// <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);
                 }
             }
         }
     }
 }
Пример #3
0
        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 { }
            }
        }
Пример #4
0
        /// <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);
                    }
                }
            }
        }