private void StartReceive(ZYSocketAsyncEventArgs e) { if (!e.AcceptSocket.ReceiveAsync(e)) { BeginReceive(e); } }
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); } }
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); } }
void Asyn_Completed(object sender, ZYSocketAsyncEventArgs e) { switch (e.LastOperation) { case SocketAsyncOperation.Accept: BeginAccep(e); break; case SocketAsyncOperation.Receive: BeginReceive(e); break; } }
void Accept(ZYSocketAsyncEventArgs sockasyn) { sockasyn.Reset(); try { if (!Sock !.AcceptAsync(sockasyn)) { BeginAccep(sockasyn); } } catch (ObjectDisposedException) { } }
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); }
/// <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); } }
/// <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); } }