コード例 #1
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="data"></param>
        /// <param name="repoteEndPointStr"></param>
        protected virtual void SendAsync(byte[] data, string repoteEndPointStr)
        {
            SocketAsyncEventArgs readEventArgs;
            var flag = ReadSocketEventArgsTable.TryGetValue(repoteEndPointStr, out readEventArgs);

            if (!flag || readEventArgs == null)
            {
                Logger.Error("{0}客户连接【{1}】无效", ServiceName, repoteEndPointStr);
                return;
            }
            var write = new SocketAsyncEventArgs();

            write.Completed   += OnSocketEventCompleted;
            write.AcceptSocket = (readEventArgs.UserToken as Socket);
            write.UserToken    = readEventArgs.UserToken;
            var client = (readEventArgs.UserToken as Socket);

            if (client != null)
            {
                write.SetBuffer(data, 0, data.Length);
                bool willRaiseEvent = client.SendAsync(write);
                if (!willRaiseEvent)
                {
                    ProcessSend(write);
                }
            }
            else
            {
                Logger.Error(ServiceName + ".SendAsync 连接已经断开");
            }
        }
コード例 #2
0
        /// <summary>
        /// 关闭套件信息
        /// </summary>
        /// <param name="e"></param>
        protected void CloseClientSocket(SocketAsyncEventArgs e)
        {
            var client = e.UserToken as Socket;

            if (client == null)
            {
                return;
            }

            // close the socket associated with the client
            try
            {
                //保证资源清理
                SocketAsyncEventArgs readSocketEventArgs;
                ReadSocketEventArgsTable.TryRemove(client.RemoteEndPoint.ToString(), out readSocketEventArgs);
                e.UserToken = null;
                client.Shutdown(SocketShutdown.Send);
            }
            // throws if client process has already closed
            catch (Exception ex)
            {
                Logger.Error(ex, "CloseClientSocket");
            }
            client.Close();
            // decrement the counter keeping track of the total number of clients connected to the server
            Interlocked.Decrement(ref _mNumConnectedSockets);
            _mMaxNumberAcceptedClients.Release();
            Logger.Log(LogLevel.Trace, string.Format("关闭连接. 目前仍有{0}客户连接", _mNumConnectedSockets));
            // Free the SocketAsyncEventArg so they can be reused by another client
            _mReadPool.Push(e);
        }
コード例 #3
0
        private void OnStoped()
        {
            _listenSocket.Close();
            var list = ReadSocketEventArgsTable.ToArray();

            ReadSocketEventArgsTable.Clear();
            foreach (var socketAsyncEventArgse in list)
            {
                var clientsocket = (Socket)socketAsyncEventArgse.Value.UserToken;
                if (clientsocket != null && clientsocket.Connected)
                {
                    // close the socket associated with the client
                    try
                    {
                        clientsocket.Shutdown(SocketShutdown.Both);
                    }
                    catch (Exception)
                    {
                        // throws if client process has already closed
                    }
                    finally
                    {
                        if (clientsocket.Connected)
                        {
                            clientsocket.Close();
                        }
                    }
                }
            }
        }
コード例 #4
0
        /// <summary>
        /// 根据键值关闭套件信息
        /// </summary>
        /// <param name="key"></param>
        public void CloseClientSocket(string key)
        {
            SocketAsyncEventArgs readSocketEventArgs;
            var flag = ReadSocketEventArgsTable.TryRemove(key, out readSocketEventArgs);

            if (flag && readSocketEventArgs != null)
            {
                CloseClientSocket(readSocketEventArgs);
            }
        }
コード例 #5
0
        private void ProcessAccept(SocketAsyncEventArgs e)
        {
            if (e.SocketError == SocketError.Success)
            {
                try
                {
                    if (e.AcceptSocket != null)
                    {
                        Interlocked.Increment(ref _mNumConnectedSockets);
                        Logger.Log(LogLevel.Trace, string.Format("建立连接. 目前有{0}客户连接",
                                                                 _mNumConnectedSockets));

                        //ReadEventArg object user token
                        SocketAsyncEventArgs readEventArgs = _mReadPool.Pop();
                        readEventArgs.UserToken = e.AcceptSocket;
                        //记录目前连接客户端
                        string key = e.AcceptSocket.RemoteEndPoint.ToString();
                        ReadSocketEventArgsTable.TryAdd(key, readEventArgs);
                        bool willRaiseEvent = e.AcceptSocket.ReceiveAsync(readEventArgs);
                        if (!willRaiseEvent)
                        {
                            ProcessReceive(readEventArgs);
                        }
                    }
                    else
                    {
                        Logger.Error("AcceptEventArgCompleted SocketError:" + e.SocketError);
                    }
                }
                catch (Exception ex)
                {
                    Logger.Error(ex, ServiceName + ".ProcessAccept");
                }
            }
            else
            {
                Logger.Log(LogLevel.Trace, string.Format("连接状态{0}", e.SocketError));
            }
            // Accept the next connection request
            if (IsRunning)
            {
                StartAccept(e);
            }
        }