Ejemplo n.º 1
0
 void RemoveSession(IOCPSocketAsyncEventArgs args)
 {
     if (args.UserToken != null)
     {
         Session removesession;
         //用户断开了
         if (_connectSocketDic.TryRemove(args.UserToken.ToString(), out removesession))
         {
             RealseSocketAsyncEventArgs(args);
         }
     }
     else
     {
         RealseSocketAsyncEventArgs(args);
     }
 }
Ejemplo n.º 2
0
 private void RealseSocketAsyncEventArgs(IOCPSocketAsyncEventArgs e)
 {
     e.Completed -= SocketAsyncEventArgs_Completed;
     _bufferpoll.RealseBuffer(e.BufferIndex);
     e.ClearBuffer();
     //e.AcceptSocket.Disconnect(true);
     try
     {
         e.AcceptSocket.Shutdown(SocketShutdown.Send);
     }
     catch
     {
     }
     e.AcceptSocket.Close();
     e.AcceptSocket = null;
     _iocpQueue.Enqueue(e);
 }
Ejemplo n.º 3
0
        private SocketAsyncEventArgs GetSocketAsyncEventArgs()
        {
            IOCPSocketAsyncEventArgs args;

            if (_iocpQueue.TryDequeue(out args))
            {
                args.Completed += Args_Completed;
                //args.ClearBuffer()
                args.IsReadPackLen = false;
            }
            else
            {
                args            = new IOCPSocketAsyncEventArgs();
                args.Completed += Args_Completed;
            }

            return(args);
        }
Ejemplo n.º 4
0
        private void SetBuffer(IOCPSocketAsyncEventArgs e, int offset, int len)
        {
            if (offset > 0)
            {
                offset = (e.BufferIndex == -1 ? 0 : _bufferpoll.GetOffset(e.BufferIndex)) + offset;
                e.SetBuffer(offset, len);
                return;
            }

            byte[] buf = null;
            if (len <= _bufferpoll.BlockSize)
            {
                if (e.BufferIndex == -1)
                {
                    var newindex = _bufferpoll.GetBuffer();
                    if (newindex == -1)
                    {
                        buf = new byte[len];
                    }
                    else
                    {
                        e.BufferIndex = newindex;
                    }
                }
            }
            else
            {
                if (e.BufferIndex > 0)
                {
                    _bufferpoll.RealseBuffer(e.BufferIndex);
                    e.BufferIndex = -1;
                }
                buf = new byte[len];
            }

            if (buf != null)
            {
                e.SetBuffer(buf, offset, len);
            }
            else
            {
                e.SetBuffer(_bufferpoll.Buffer, _bufferpoll.GetOffset(e.BufferIndex) + offset, len);
            }
        }
        private void SetBuffer(IOCPSocketAsyncEventArgs e, int offset, int len)
        {
            if (offset > 0)
            {
                e.SetBuffer(offset, len);
                return;
            }

            byte[] buf = null;
            if (len > _readbytes.Length)
            {
                buf = new byte[len];
                e.SetBuffer(buf, offset, len);
            }
            else
            {
                e.SetBuffer(_readbytes, offset, len);
            }
        }
        public bool StartClient()
        {
            lock (this)
            {
                try
                {
                    if (socketClient != null && socketClient.Connected)
                    {
                        return(true);
                    }

                    if (DateTime.Now.Subtract(lastReStartClientTime).TotalMilliseconds <= reConnectClientTimeInterval)
                    {
                        return(false);
                    }

                    bool isResetClient = false;
                    if (socketClient != null)
                    {
                        socketClient.Close();
                        isResetClient = true;
                    }

                    if (!string.IsNullOrWhiteSpace(encryKey))
                    {
                        encryKey = string.Empty;
                    }

                    socketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                    socketClient.ReceiveBufferSize = 32000;
                    socketClient.SendBufferSize    = 32000;
                    socketClient.NoDelay           = true;

                    try
                    {
                        if (socketAsyncEvent != null)
                        {
                            socketAsyncEvent.Completed -= socketAsyncEvent_Completed;
                        }

                        IPAddress connectip;
                        if (!string.IsNullOrEmpty(serverIp))
                        {
                            connectip = IPAddress.Parse(serverIp);
                        }
                        else
                        {
                            connectip = IPAddress.Any;
                        }
                        socketAsyncEvent                = new IOCPSocketAsyncEventArgs();
                        socketAsyncEvent.Completed     += socketAsyncEvent_Completed;
                        socketAsyncEvent.RemoteEndPoint = new IPEndPoint(connectip, ipPort);

                        _startSign.Reset();
                        socketClient.ConnectAsync(socketAsyncEvent);
                        _startSign.WaitOne(30 * 1000);

                        if (!socketClient.Connected)
                        {
                            throw new Exception("连接超时");
                        }

                        if (isSecurity)
                        {
                            RsaEncryHelper.GenPair(out rsaPubKey, out rsaRrivateKey);
                            var msg = new Message(MessageType.NEGOTIATIONENCRYR);
                            encryKey = null;
                            _startSign.Reset();
                            msg.SetMessageBody(new NegotiationEncryMessage
                            {
                                PublicKey = rsaPubKey
                            });
                            socketClient.SendMessage(msg, string.Empty);
                            _startSign.WaitOne(30 * 1000);
                            if (string.IsNullOrWhiteSpace(encryKey))
                            {
                                throw new Exception("协商加密失败");
                            }
                        }
                    }
                    catch (SocketException e)
                    {
                        var ne = new Exception(string.Format("连接到远程服务器{0}失败,端口:{1},原因:{2},网络错误号:{3}",
                                                             serverIp, ipPort, e.Message, e.SocketErrorCode));
                        throw ne;
                    }
                    catch (Exception e)
                    {
                        lastReStartClientTime = DateTime.Now;
                        throw e;
                    }

                    isStartClient = true;

                    if (isResetClient && OnClientReset != null)
                    {
                        OnClientReset();
                    }

                    return(true);
                }
                catch (Exception e)
                {
                    //OnError(e);
                    return(false);
                }
            }
        }