コード例 #1
0
ファイル: ZYSocketSuper.cs プロジェクト: Mrwch/ZYSOCKET-V
 private void StartReceive(ZYSocketAsyncEventArgs e)
 {
     if (!e.AcceptSocket.ReceiveAsync(e))
     {
         BeginReceive(e);
     }
 }
コード例 #2
0
ファイル: ZYSocketSuper.cs プロジェクト: Mrwch/ZYSOCKET-V
        void BeginReceive(ZYSocketAsyncEventArgs e)
        {
            if (e.SocketError == SocketError.Success && e.BytesTransferred > 0)
            {
                e.Advance();

                if (!e.AcceptSocket.ReceiveAsync(e))
                {
                    if (e.Add_check() > 512)
                    {
                        e.Reset_check();
                        ThreadPool.QueueUserWorkItem(obj => BeginReceive((obj as ZYSocketAsyncEventArgs) !), e);
                    }
                    else
                    {
                        BeginReceive(e);
                    }
                }

                e.Reset_check();
            }
            else
            {
                Disconnect_It(e);
            }
        }
コード例 #3
0
ファイル: ZYSocketSuper.cs プロジェクト: Mrwch/ZYSOCKET-V
        void BeginAccep(ZYSocketAsyncEventArgs e)
        {
            if (e.SocketError == SocketError.Success)
            {
                System.Threading.WaitHandle.WaitAll(reset);

                if (this.Connetions != null)
                {
                    if (!this.Connetions(e))
                    {
                        try
                        {
                            e.AcceptSocket?.Shutdown(SocketShutdown.Both);
                        }
                        catch { }

                        e.AcceptSocket = null;
                        Accept(e);
                        return;
                    }
                }

                e.SetBuffer(MaxBufferSize);
                BinaryInput?.Invoke(e);
                e.StreamInit();
                StartReceive(e);
            }
            else
            {
                Accept(e);
            }
        }
コード例 #4
0
ファイル: ZYSocketSuper.cs プロジェクト: Mrwch/ZYSOCKET-V
        void Asyn_Completed(object sender, ZYSocketAsyncEventArgs e)
        {
            switch (e.LastOperation)
            {
            case SocketAsyncOperation.Accept:
                BeginAccep(e);
                break;

            case SocketAsyncOperation.Receive:
                BeginReceive(e);
                break;
            }
        }
コード例 #5
0
ファイル: ZYSocketSuper.cs プロジェクト: Mrwch/ZYSOCKET-V
        void Accept(ZYSocketAsyncEventArgs sockasyn)
        {
            sockasyn.Reset();

            try
            {
                if (!Sock !.AcceptAsync(sockasyn))
                {
                    BeginAccep(sockasyn);
                }
            }
            catch (ObjectDisposedException) { }
        }
コード例 #6
0
ファイル: ZYSocketSuper.cs プロジェクト: luyikk/ZYSOCKET-V
        void Disconnect_It(ZYSocketAsyncEventArgs e)
        {

            if (MessageInput != null && e.AcceptSocket != null)
            {

                string message;

                try
                {
                    message = string.Format("User Disconnect :{0}", e.AcceptSocket.RemoteEndPoint.ToString());
                }
                catch (System.ObjectDisposedException)
                {
                    message = "User Disconnect";
                }
                catch (System.NullReferenceException)
                {
                    message = "User Disconnect";
                }
                catch (SocketException)
                {
                    message = "User Disconnect";
                }


                MessageInput.Invoke(message, e, 0);

            }
            else
            {
                MessageInput?.Invoke("User disconnect but cannot get Ipaddress", e, 0);
            }

            e.AcceptSocket = null;
            
            if(e.IsInit)
                Accept(e);
        }
コード例 #7
0
ファイル: ZYSocketSuper.cs プロジェクト: Mrwch/ZYSOCKET-V
        /// <summary>
        /// 启动
        /// </summary>
        private void Run(IServiceProvider component)
        {
            if (isDisposed == true)
            {
                throw new ObjectDisposedException("ZYServer is Disposed");
            }

            var config = component.GetService <SocketServerOptions>();


            IPEndPoint myEnd = new IPEndPoint(IPAddress.Any, Port);

            if (Host.Equals("ipv6any", StringComparison.CurrentCultureIgnoreCase))
            {
                myEnd = new IPEndPoint(IPAddress.IPv6Any, Port);
            }
            else if (!Host.Equals("any", StringComparison.CurrentCultureIgnoreCase))
            {
                if (String.IsNullOrEmpty(Host))
                {
                    IPHostEntry p = Dns.GetHostEntry(Dns.GetHostName());

                    foreach (IPAddress s in p.AddressList)
                    {
                        if (!s.IsIPv6LinkLocal && s.AddressFamily != AddressFamily.InterNetworkV6)
                        {
                            myEnd = new IPEndPoint(s, Port);
                            break;
                        }
                    }
                }
                else
                {
                    try
                    {
                        myEnd = new IPEndPoint(IPAddress.Parse(Host), Port);
                    }
                    catch (FormatException)
                    {
                        IPHostEntry p = Dns.GetHostEntry(Dns.GetHostName());

                        foreach (IPAddress s in p.AddressList)
                        {
                            if (!s.IsIPv6LinkLocal)
                            {
                                myEnd = new IPEndPoint(s, Port);
                            }
                        }
                    }
                }
            }

            sock = new Socket(myEnd.AddressFamily, SocketType.Stream, ProtocolType.Tcp);

            sock.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, 1);


            sock.Bind(myEnd);
            sock.Listen(config.BackLog);

            if (config.ReceiveTimeout > 0)
            {
                ReceiveTimeout = config.ReceiveTimeout;
            }
            if (config.SendTimeout > 0)
            {
                SendTimeout = config.SendTimeout;
            }



            var memoryPool = component.GetRequiredService <MemoryPool <byte> >();
            var encode     = component.GetRequiredService <Encoding>();
            var objFormat  = component.GetRequiredService <ISerialization>();

            for (int i = 0; i < MaxConnectCout; i++)
            {
                var poolSend      = component.GetRequiredService <ISend>();
                var poolAsyncSend = component.GetRequiredService <IAsyncSend>();

                ZYSocketAsyncEventArgs socketasyn = new ZYSocketAsyncEventArgs(
                    new LinesReadStream(MaxBufferSize),
                    new BufferWriteStream(memoryPool, poolSend, poolAsyncSend),
                    poolSend,
                    poolAsyncSend,
                    memoryPool,
                    encode,
                    objFormat,
                    config.IsLittleEndian
                    )
                {
                    DisconnectIt = Disconnect_It
                };
                poolSend.SetAccpet(socketasyn);
                poolAsyncSend.SetAccpet(socketasyn);

                socketasyn.Completed += new EventHandler <ZYSocketAsyncEventArgs>(Asyn_Completed);
                Accept(socketasyn);
            }
        }
コード例 #8
0
ファイル: ZYSocketSuper.cs プロジェクト: Mrwch/ZYSOCKET-V
        /// <summary>
        /// 启动
        /// </summary>
        private void Run()
        {
            if (isDisposed == true)
            {
                throw new ObjectDisposedException("ZYServer is Disposed");
            }


            IPEndPoint myEnd = new IPEndPoint(IPAddress.Any, Port);

            if (Host.Equals("ipv6any", StringComparison.CurrentCultureIgnoreCase))
            {
                myEnd = new IPEndPoint(IPAddress.IPv6Any, Port);
            }
            else if (!Host.Equals("any", StringComparison.CurrentCultureIgnoreCase))
            {
                if (String.IsNullOrEmpty(Host))
                {
                    IPHostEntry p = Dns.GetHostEntry(Dns.GetHostName());

                    foreach (IPAddress s in p.AddressList)
                    {
                        if (!s.IsIPv6LinkLocal && s.AddressFamily != AddressFamily.InterNetworkV6)
                        {
                            myEnd = new IPEndPoint(s, Port);
                            break;
                        }
                    }
                }
                else
                {
                    try
                    {
                        myEnd = new IPEndPoint(IPAddress.Parse(Host), Port);
                    }
                    catch (FormatException)
                    {
                        IPHostEntry p = Dns.GetHostEntry(Dns.GetHostName());

                        foreach (IPAddress s in p.AddressList)
                        {
                            if (!s.IsIPv6LinkLocal)
                            {
                                myEnd = new IPEndPoint(s, Port);
                            }
                        }
                    }
                }
            }

            sock = new Socket(myEnd.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
            sock.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, 1);

            sock.Bind(myEnd);
            sock.Listen(512);
            ReceiveTimeout = 1000;

            var memoryPool = new Thruster.FastMemoryPool <byte>();

            for (int i = 0; i < MaxConnectCout; i++)
            {
                var netSend = new NetSend(true);

                ZYSocketAsyncEventArgs socketasyn = new ZYSocketAsyncEventArgs(
                    new LinesReadStream(MaxBufferSize),
                    new BufferWriteStream(memoryPool, netSend, netSend),
                    netSend,
                    netSend,
                    memoryPool,
                    Encoding.UTF8
                    )
                {
                    DisconnectIt = Disconnect_It
                };
                netSend.SetAccpet(socketasyn);
                socketasyn.Completed += new EventHandler <ZYSocketAsyncEventArgs>(Asyn_Completed);
                Accept(socketasyn);
            }
        }