From b6840329023c8ea43016a2077319f78fdfc2a236 Mon Sep 17 00:00:00 2001 From: Henry Date: Wed, 9 Sep 2020 10:41:24 +0800 Subject: [PATCH] update to v1.5.3.2 --- .gitignore | 57 ++++++++ .vs/BeetleX/v15/.suo | Bin 54272 -> 64000 bytes src/BeetleX/BeetleX.csproj | 6 +- src/BeetleX/Buffers/PipeStreamExtens.cs | 24 +++- src/BeetleX/Buffers/Pool.cs | 3 +- src/BeetleX/Clients/AwaiterClient.cs | 2 +- src/BeetleX/Clients/Clients.cs | 138 +++++++++++--------- src/BeetleX/EventArgs/ServerLogEventArgs.cs | 1 + src/BeetleX/IServerHandler.cs | 4 + src/BeetleX/ISession.cs | 2 + src/BeetleX/ListenHandler.cs | 60 ++++++--- src/BeetleX/ServerHandlerBase.cs | 5 + src/BeetleX/ServerStatus.cs | 5 +- src/BeetleX/TcpServer.cs | 39 ++++-- src/BeetleX/TcpSession.cs | 12 +- 15 files changed, 246 insertions(+), 112 deletions(-) diff --git a/.gitignore b/.gitignore index 62bdae3..3c0bc72 100644 --- a/.gitignore +++ b/.gitignore @@ -67,3 +67,60 @@ samples/Protobuf.Server/obj/ samples/Http.Server/Properties/ samples/Http.Server/bin/ samples/Http.Server/obj/ +samples/TCP.FixedString/.vs/ +samples/TCP.FixedString/Client/bin/ +samples/TCP.FixedString/Client/obj/ +samples/TCP.FixedString/Server/bin/ +samples/TCP.FixedString/Server/obj/ +samples/TCP.Hello/.vs/ +samples/TCP.Hello/Client/bin/ +samples/TCP.Hello/Client/obj/ +samples/TCP.Hello/Server/bin/ +samples/TCP.Hello/Server/obj/ +samples/TCP.JsonFormater/.vs/ +samples/TCP.JsonFormater/Client/bin/ +samples/TCP.JsonFormater/Client/obj/ +samples/TCP.JsonFormater/Messages/bin/ +samples/TCP.JsonFormater/Messages/obj/ +samples/TCP.JsonFormater/Server/bin/ +samples/TCP.JsonFormater/Server/obj/ +samples/TCP.MessagePackFormater/.vs/ +samples/TCP.MessagePackFormater/Client/bin/ +samples/TCP.MessagePackFormater/Client/obj/ +samples/TCP.MessagePackFormater/Messages/bin/ +samples/TCP.MessagePackFormater/Messages/obj/ +samples/TCP.MessagePackFormater/Server/bin/ +samples/TCP.MessagePackFormater/Server/obj/ +samples/TCP.ProtobufFormater/.vs/ +samples/TCP.ProtobufFormater/Client/bin/ +samples/TCP.ProtobufFormater/Client/obj/ +samples/TCP.ProtobufFormater/Messages/bin/ +samples/TCP.ProtobufFormater/Messages/obj/ +samples/TCP.ProtobufFormater/Server/bin/ +samples/TCP.ProtobufFormater/Server/obj/ +samples/TCP.SSL/.vs/ +samples/TCP.SSL/Client/bin/ +samples/TCP.SSL/Client/obj/ +samples/TCP.SSL/Messages/bin/ +samples/TCP.SSL/Messages/obj/ +samples/TCP.SSL/Server/bin/ +samples/TCP.SSL/Server/obj/ +samples/TCP.BaseHttp/.vs/ +samples/TCP.BaseHttp/TCP.BaseHttp/bin/ +samples/TCP.BaseHttp/TCP.BaseHttp/obj/ +samples/TCP.BaseHttp/TCP.BaseHttp/Properties/ +samples/TCP.AsynClient/.vs/ +samples/TCP.AsynClient/Client/bin/ +samples/TCP.AsynClient/Client/obj/ +samples/TCP.AsynClient/Server/bin/ +samples/TCP.AsynClient/Server/obj/ +samples/TCP.Awaiter/.vs/ +samples/TCP.Awaiter/Client/bin/ +samples/TCP.Awaiter/Client/obj/ +samples/TCP.Awaiter/Server/bin/ +samples/TCP.Awaiter/Server/obj/ +samples/TCP.BaseHttp/TCP.BaseHttp/TCP.BaseHttp.csproj.user +samples/TCP.FixedString/Server/Properties/ +samples/TCP.FixedString/Server/Server.csproj.user +.vs/BeetleX/v16/ +.vs/BeetleX/DesignTimeBuild/.dtbcache.v2 diff --git a/.vs/BeetleX/v15/.suo b/.vs/BeetleX/v15/.suo index 8cde5ebc60e091504b31d15c909966cd796376e0..324c4c0418ffe51203659fd147f881cb9b21675f 100644 GIT binary patch delta 1318 zcmc(eTSydP6vy}b_BLLUscgwKbt@~)Y|ZRq+J&|tl1eJG5?sq}W}D^Og+y1A$_%kN zQDR{^j5I6yzA3IIirHNFi1#+Vh$p%?q5zxS5uoP?oT;n6_y67P8c$Z4}Q=keQ20?HHRD+}77^nduPz#QO6W}D^N#?`z zK0fR^nMG(H3`Rt7kw`B>{yXxKsUuqOGpq%B*2U7oQM%rN73;y7h{agzh#ssJ=W;B+ z41ONS1FTa%7`;@K^55lIfifH%lhk_p7DljigI`+Jn^bDQmT$rlrJDTi9a7~n$fxTH6DvR@yPr6kocu~*{ zZ>mb|dMAveVWHDV(guf*Yj(w@aSes0hhq;RkUR|+m=W*SX2bKDv^I*Nlkrb!jb1?E zDPeRss#gh{T3y{Ij1oWfOP>mrY{F}U|?PTAclBxQBZ zqO|HnYnSe>tAdxb`C2@!e5})(8*^h8F3!pH)vYV9s@bce0$+t$=lbiPq)>1Zx2B=s zfF{sB;n(19=VdG=s*yA9sn)23QOCB{kCYp89?C}`&+b2{Y&66{QG}KUN z9Cx@}HTcx_(5L!hYPvU#G8*2PFQp3K594yyA?W?NWD0cUQQosz=6Ol_(?pfn_R&tc zkMdRim3~3XA8b?`drsShq8Du;TG6YiSAE|!&s%hfn44R|{CBuUt>{g_i|DVV_BKrg bp7ct3+`5bgTC@MbOc70u=gL*Zv+K?u_r00+ delta 1040 zcmcJOOKTHR6vyY>Oq0o@F{Cwxm}*QLDABt6ETOlo+LiP$WVZA;}^O z!7g;}CvY~6(1m6ef>0IGMWHJZT~`qF0|aRc8vmzFY7j&>p5e#6_q^`?-mEZV!Jnom9QH`S&~m_A_!g<(dl zhid~?#!)C8L8G8i2ok458-QLf~N=CJAc=+1unN~VEMorYk zuIs^W9M9q54f%DmnfHYm5JquHE^X_PmEu(mpSiLZ)H}%Zvsp7GN)u&rQVRlm8iFip zb#7Uf#gRW3w+h23bBa|lJY>$RMl7MLT6`p!S*u;G9GP7#^PWgZMr#qE- zZ->=USZPBG+0}{p?G=)5Z#pbTYK=-05waq43qJ9lq{#HyR3#w8*?={cDUiID{bE;c eDJdl`2Xo_Y9e*J|Fzabhenryfan true false - 1.5.1.6 - 1.5.1.6 - 1.5.1.6 + 1.5.3.2 + 1.5.3.2 + 1.5.3.2 high performance dotnet core socket tcp communication components, support tcp, ssl, http, websocket, rpc, redis ... protocols and 1M connections problem solution Copyright © 2019-2020 beetlex.io https://github.com/IKende/BeetleX diff --git a/src/BeetleX/Buffers/PipeStreamExtens.cs b/src/BeetleX/Buffers/PipeStreamExtens.cs index 9d17eeb..3170bde 100644 --- a/src/BeetleX/Buffers/PipeStreamExtens.cs +++ b/src/BeetleX/Buffers/PipeStreamExtens.cs @@ -172,9 +172,29 @@ public void Write(StringBuilder data, Encoding encoding = null) } } - } - + public int Buffers + { + get + { + if (FirstBuffer == null) + { + return 0; + } + else + { + int count = 1; + var buffer = FirstBuffer.Next; + while (buffer != null) + { + count++; + buffer = buffer.Next; + } + return count; + } + } + } + } } namespace BeetleX diff --git a/src/BeetleX/Buffers/Pool.cs b/src/BeetleX/Buffers/Pool.cs index b091d09..bd7027f 100644 --- a/src/BeetleX/Buffers/Pool.cs +++ b/src/BeetleX/Buffers/Pool.cs @@ -244,14 +244,15 @@ public IBuffer Pop() item = CreateBuffer(); } item.Reset(); + item.Pool = this; Interlocked.Decrement(ref mCount); return item; - } public void Push(IBuffer item) { Interlocked.Increment(ref mCount); + item.Pool = null; mPool.Push(item); } diff --git a/src/BeetleX/Clients/AwaiterClient.cs b/src/BeetleX/Clients/AwaiterClient.cs index b0f7d68..4e062ba 100644 --- a/src/BeetleX/Clients/AwaiterClient.cs +++ b/src/BeetleX/Clients/AwaiterClient.cs @@ -41,7 +41,7 @@ public AwaiterClient(string host, int port, IClientPacket packet, string sslServ private static void OnProcess((AwaiterClient client, object result) item) { - item.client.Success(item.result); + item.client.Success(item.result); } private void OnError(IClient c, ClientErrorArgs e) diff --git a/src/BeetleX/Clients/Clients.cs b/src/BeetleX/Clients/Clients.cs index 9ec80ae..0487f59 100644 --- a/src/BeetleX/Clients/Clients.cs +++ b/src/BeetleX/Clients/Clients.cs @@ -267,9 +267,17 @@ private void OnConnect() this.Connected?.Invoke(this); } + public SslProtocols? SslProtocols { get; set; } = System.Security.Authentication.SslProtocols.Tls11 | System.Security.Authentication.SslProtocols.Tls12; + + public X509CertificateCollection CertificateCollection { get; private set; } = new X509CertificateCollection(); + protected virtual void OnSslAuthenticate(SslStream sslStream) { - var task = sslStream.AuthenticateAsClientAsync(SslServiceName); + Task task; + if (SslProtocols == null) + SslProtocols = System.Security.Authentication.SslProtocols.Tls | System.Security.Authentication.SslProtocols.Tls11 | + System.Security.Authentication.SslProtocols.Tls12; + task = sslStream.AuthenticateAsClientAsync(SslServiceName, CertificateCollection.Count > 0 ? CertificateCollection : null, SslProtocols.Value, false); task.Wait(); } @@ -621,9 +629,9 @@ public void Init(string host, int port, IClientPacket packet) private SslStreamX mSslStream = null; - private AwaitObject awaitPipeStream = new AwaitObject(); + //private AwaitObject awaitPipeStream = new AwaitObject(); - private AwaitObject mReadMessageAwait = new AwaitObject(); + //private AwaitObject mReadMessageAwait = new AwaitObject(); private int mPort; @@ -635,10 +643,10 @@ public void ProcessError(Exception e_, string message = null) e.Message = message; try { - if (awaitPipeStream.Pending) - awaitPipeStream.Error(e_); - if (mReadMessageAwait.Pending) - mReadMessageAwait.Error(e_); + //if (awaitPipeStream.Pending) + // awaitPipeStream.Error(e_); + //if (mReadMessageAwait.Pending) + // mReadMessageAwait.Error(e_); ClientError?.Invoke(this, e); } catch @@ -661,7 +669,7 @@ public void DisConnect() mSocket = null; } mReceiveEventArgs?.Clear(); - mReceiveEventArgs?.Dispose(); + mReceiveEventArgs?.Dispose(); mReceiveEventArgs = null; mSendEventArgs?.Clear(); mSendEventArgs?.Dispose(); @@ -692,14 +700,14 @@ public void DisConnect() { } } - if (awaitPipeStream.Pending) - { - awaitPipeStream.Error(new SocketException((int)SocketError.ConnectionAborted)); - } - if (mReadMessageAwait.Pending) - { - mReadMessageAwait.Error(new SocketException((int)SocketError.ConnectionAborted)); - } + //if (awaitPipeStream.Pending) + //{ + // awaitPipeStream.Error(new SocketException((int)SocketError.ConnectionAborted)); + //} + //if (mReadMessageAwait.Pending) + //{ + // mReadMessageAwait.Error(new SocketException((int)SocketError.ConnectionAborted)); + //} } private static void IO_Completed(object sender, SocketAsyncEventArgs e) @@ -740,9 +748,9 @@ private void OnReceive() try { mReceiveArgs.Stream = this.Stream; - if (awaitPipeStream.Pending) - awaitPipeStream.Success(this.Stream.ToPipeStream()); - else + //if (awaitPipeStream.Pending) + // awaitPipeStream.Success(this.Stream.ToPipeStream()); + //else DataReceive?.Invoke(this, mReceiveArgs); } @@ -918,45 +926,45 @@ protected virtual bool ValidateServerCertificate(object sender, X509Certificate return false; } - public AwaitObject ReceiveMessage() - { - mReadMessageAwait.Reset(); - bool isconnect; - Connect(out isconnect); - if (Packet == null) - ProcessError(new BXException("packet is empty be cannot receive messages!"), "packet is empty be cannot receive messages"); - if (!AutoReceive) - BeginReceive(); - return mReadMessageAwait; - } - - public AwaitStruct ReceiveFrom(Action writeHandler) - { - var result = Receive(); - if (writeHandler != null) - { - PipeStream stream = this.Stream.ToPipeStream(); - writeHandler(stream); - if (stream.CacheLength > 0) - this.Stream.Flush(); - } - return result; - } - - public AwaitStruct ReceiveMessage() - { - return new AwaitStruct(ReceiveMessage()); - } - - public AwaitStruct Receive() - { - awaitPipeStream.Reset(); - bool isconnect; - Connect(out isconnect); - if (!AutoReceive) - BeginReceive(); - return new AwaitStruct(awaitPipeStream); - } + //public AwaitObject ReceiveMessage() + //{ + // mReadMessageAwait.Reset(); + // bool isconnect; + // Connect(out isconnect); + // if (Packet == null) + // ProcessError(new BXException("packet is empty be cannot receive messages!"), "packet is empty be cannot receive messages"); + // if (!AutoReceive) + // BeginReceive(); + // return mReadMessageAwait; + //} + + //public AwaitStruct ReceiveFrom(Action writeHandler) + //{ + // var result = Receive(); + // if (writeHandler != null) + // { + // PipeStream stream = this.Stream.ToPipeStream(); + // writeHandler(stream); + // if (stream.CacheLength > 0) + // this.Stream.Flush(); + // } + // return result; + //} + + //public AwaitStruct ReceiveMessage() + //{ + // return new AwaitStruct(ReceiveMessage()); + //} + + //public AwaitStruct Receive() + //{ + // awaitPipeStream.Reset(); + // bool isconnect; + // Connect(out isconnect); + // if (!AutoReceive) + // BeginReceive(); + // return new AwaitStruct(awaitPipeStream); + //} public bool Connect(out bool newConnection) { @@ -1029,13 +1037,15 @@ public bool Connect(out bool newConnection) } public SslProtocols? SslProtocols { get; set; } = System.Security.Authentication.SslProtocols.Tls11 | System.Security.Authentication.SslProtocols.Tls12; + public X509CertificateCollection CertificateCollection { get; private set; } = new X509CertificateCollection(); + protected virtual void OnSslAuthenticate(SslStream sslStream) { Task task; if (SslProtocols == null) - task = sslStream.AuthenticateAsClientAsync(SslServiceName); - else - task = sslStream.AuthenticateAsClientAsync(SslServiceName, null, SslProtocols.Value, false); + SslProtocols = System.Security.Authentication.SslProtocols.Tls | System.Security.Authentication.SslProtocols.Tls11 | + System.Security.Authentication.SslProtocols.Tls12; + task = sslStream.AuthenticateAsClientAsync(SslServiceName, CertificateCollection.Count > 0 ? CertificateCollection : null, SslProtocols.Value, false); task.Wait(); } @@ -1234,9 +1244,9 @@ private void OnPacketCompleted(IClient client, object message) { try { - if (mReadMessageAwait.Pending) - mReadMessageAwait.Success(message); - else + //if (mReadMessageAwait.Pending) + // mReadMessageAwait.Success(message); + //else PacketReceive?.Invoke(this, message); } catch (Exception e_) diff --git a/src/BeetleX/EventArgs/ServerLogEventArgs.cs b/src/BeetleX/EventArgs/ServerLogEventArgs.cs index eb56d21..97388ac 100644 --- a/src/BeetleX/EventArgs/ServerLogEventArgs.cs +++ b/src/BeetleX/EventArgs/ServerLogEventArgs.cs @@ -21,6 +21,7 @@ public ServerLogEventArgs(string message, LogType type, ISession session = null) public LogType Type { get; set; } + public string Message { get; diff --git a/src/BeetleX/IServerHandler.cs b/src/BeetleX/IServerHandler.cs index 83aab0d..9137671 100644 --- a/src/BeetleX/IServerHandler.cs +++ b/src/BeetleX/IServerHandler.cs @@ -9,6 +9,8 @@ namespace BeetleX public interface IServerHandler { + IServer Server { get; set; } + void Connecting(IServer server, EventArgs.ConnectingEventArgs e); void Connected(IServer server, EventArgs.ConnectedEventArgs e); @@ -25,5 +27,7 @@ public interface IServerHandler void SessionDetection(IServer server, SessionDetectionEventArgs e); + void Opened(IServer server); + } } diff --git a/src/BeetleX/ISession.cs b/src/BeetleX/ISession.cs index 7ecff67..3eba600 100644 --- a/src/BeetleX/ISession.cs +++ b/src/BeetleX/ISession.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Net.Sockets; using System.Threading.Tasks; namespace BeetleX @@ -37,6 +38,7 @@ bool LittleEndian get; set; } + SocketError LastSocketError { get; set; } Buffers.SocketAsyncEventArgsX SendEventArgs { get; set; } diff --git a/src/BeetleX/ListenHandler.cs b/src/BeetleX/ListenHandler.cs index f22e473..656be4d 100644 --- a/src/BeetleX/ListenHandler.cs +++ b/src/BeetleX/ListenHandler.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Net; using System.Net.Sockets; +using System.Security.Authentication; using System.Security.Cryptography.X509Certificates; using System.Text; using System.Threading.Tasks; @@ -16,6 +17,8 @@ public class ListenHandler : IDisposable public string CertificateFile { get; set; } + public SslProtocols SslProtocols { get; set; } = SslProtocols.Tls | SslProtocols.Tls11 | SslProtocols.Tls12; + public string CertificatePassword { get; set; } public bool SyncAccept { get; set; } = true; @@ -126,29 +129,39 @@ private void BeginListen() } } + private int mAccetpError = 0; + private void OnSyncAccept() { - try + while (true) { - while (true) + try { + while (Server.Status == ServerStatus.Stop) + System.Threading.Thread.Sleep(500); var acceptSocket = Socket.Accept(); AcceptSocketInfo item = new AcceptSocketInfo(); item.Socket = acceptSocket; item.Listen = this; mAcceptCallBack(item); } - } - catch (Exception e_) - { - Error = e_; - if (Server.EnableLog(EventArgs.LogType.Error)) - { - Server.Log(EventArgs.LogType.Error, null, $"{Host}@{Port} accept error {e_.Message}|{e_.StackTrace}!"); - } - if (Server.EnableLog(EventArgs.LogType.Warring)) + catch (Exception e_) { - Server.Log(EventArgs.LogType.Error, null, $"{Host}@{Port} accept stoped!"); + Error = e_; + mAccetpError++; + if (Server.EnableLog(EventArgs.LogType.Error)) + { + Server.Log(EventArgs.LogType.Error, null, $"{Host}@{Port} accept error {e_.Message}|{e_.StackTrace}!"); + } + if (mAccetpError >= 10) + { + if (Server.EnableLog(EventArgs.LogType.Warring)) + { + Server.Log(EventArgs.LogType.Error, null, $"{Host}@{Port} accept stoped!"); + } + Server.Status = ServerStatus.Error; + break; + } } } } @@ -168,6 +181,7 @@ private void OnAcceptCompleted(object sender, SocketAsyncEventArgs e) item.Listen = this; e.AcceptSocket = null; mAcceptCallBack(item); + mAccetpError = 0; } else { @@ -198,19 +212,19 @@ private void OnAcceptCompleted(object sender, SocketAsyncEventArgs e) } } - - private int mAsyncAccepts = 0; private void OnAsyncAccept() { + START_ACCEPT: if (Server.EnableLog(EventArgs.LogType.Debug)) { Server.Log(EventArgs.LogType.Debug, null, $"{Host}@{Port} begin accept"); } try { - + while (Server.Status == ServerStatus.Stop) + System.Threading.Thread.Sleep(500); mAcceptEventArgs.AcceptSocket = null; if (!Socket.AcceptAsync(mAcceptEventArgs)) { @@ -221,24 +235,32 @@ private void OnAsyncAccept() { mAsyncAccepts = 0; } - + mAccetpError = 0; } catch (Exception e_) { + Error = e_; + mAccetpError++; if (Server.EnableLog(EventArgs.LogType.Error)) { Server.Log(EventArgs.LogType.Error, null, $"{Host}@{Port} accept error {e_.Message}|{e_.StackTrace}!"); } - if (Server.EnableLog(EventArgs.LogType.Warring)) + if (mAccetpError >= 10) { - Server.Log(EventArgs.LogType.Error, null, $"{Host}@{Port} accept stoped!"); + if (Server.EnableLog(EventArgs.LogType.Warring)) + { + Server.Log(EventArgs.LogType.Error, null, $"{Host}@{Port} accept stoped!"); + } + Server.Status = ServerStatus.Error; } + else + goto START_ACCEPT; } } public override string ToString() { - return $"Listen {Host}:{Port}\t[SSL:{SSL}]\t[Status:{(Error == null ? "success" : "error")}]"; + return $"Listen {Host}:{Port}\t[SSL:{SSL}]\t[Status:{(Error == null ? "success" : $"error {Error.Message}")}]"; } public void Dispose() diff --git a/src/BeetleX/ServerHandlerBase.cs b/src/BeetleX/ServerHandlerBase.cs index f49060e..047b5d8 100644 --- a/src/BeetleX/ServerHandlerBase.cs +++ b/src/BeetleX/ServerHandlerBase.cs @@ -50,6 +50,8 @@ public virtual void Log(IServer server, ServerLogEventArgs e) private object mLockConsole = new object(); + public IServer Server { get; set; } + protected virtual void OnLogToConsole(IServer server, ServerLogEventArgs e) { lock (mLockConsole) @@ -110,6 +112,9 @@ public virtual void SessionReceive(IServer server, SessionReceiveEventArgs e) } + public virtual void Opened(IServer server) + { + } } } diff --git a/src/BeetleX/ServerStatus.cs b/src/BeetleX/ServerStatus.cs index 3d7f2c9..34f88ab 100644 --- a/src/BeetleX/ServerStatus.cs +++ b/src/BeetleX/ServerStatus.cs @@ -10,10 +10,7 @@ public enum ServerStatus None, Start, Stop, - StartError, - AcceptError, - Accepting, - Accepted, + Error, Closed } } diff --git a/src/BeetleX/TcpServer.cs b/src/BeetleX/TcpServer.cs index 39504bc..b17f805 100644 --- a/src/BeetleX/TcpServer.cs +++ b/src/BeetleX/TcpServer.cs @@ -252,9 +252,9 @@ private void OnListenAcceptCallBack(AcceptSocketInfo e) public bool Open() { + bool result = false; try { - ToInitialize(); Status = ServerStatus.Start; foreach (ListenHandler item in this.Options.Listens) @@ -267,23 +267,34 @@ public bool Open() if (EnableLog(LogType.Warring)) Log(LogType.Warring, null, "no serverGC mode,please enable serverGC mode!"); } - //Log(LogType.Info, null, - // $"BeetleX [V:{typeof(TcpServer).Assembly.GetName().Version}]"); - //Log(LogType.Info, null, - // $"Environment [ServerGC:{GCSettings.IsServerGC}][IOQueue:{Options.IOQueueEnabled}|n:{Options.IOQueues}][Threads:{Environment.ProcessorCount}][Private Buffer:{Options.PrivateBufferPool}|{Options.PrivateBufferPoolSize/1024}KB]"); + if (Handler != null) + Handler.Server = this; if (WriteLogo != null) WriteLogo(); else OnWriteLogo(); - return true; + Handler?.Opened(this); + foreach (ListenHandler item in this.Options.Listens) + { + result |= (item.Error == null); + } } catch (Exception e_) { - Status = ServerStatus.StartError; + Status = ServerStatus.Error; if (EnableLog(LogType.Error)) Error(e_, null, "server start error!"); + result = false; } - return false; + if (result) + { + Status = ServerStatus.Start; + } + else + { + Status = ServerStatus.Error; + } + return result; } public Action WriteLogo { get; set; } @@ -313,13 +324,14 @@ tcp framework { logo += $" {item}\r\n"; } - logo +=" -----------------------------------------------------------------------------\r\n"; + logo += " -----------------------------------------------------------------------------\r\n"; Log(LogType.Info, null, logo); } public void Resume() { - Status = ServerStatus.Start; + if (Status == ServerStatus.Stop) + Status = ServerStatus.Start; } public bool Pause() @@ -462,7 +474,7 @@ private void BeginReceive(ISession session) Log(LogType.Info, session, $"{session.RemoteEndPoint} begin receive cancel connection disposed"); return; } - Buffers.Buffer buffer=null; + Buffers.Buffer buffer = null; try { buffer = (Buffers.Buffer)session.ReceiveBufferPool.Pop(); @@ -533,6 +545,7 @@ private void ReceiveCompleted(SocketAsyncEventArgs e) ISession session = ex.Session; try { + session.LastSocketError = e.SocketError; if (e.SocketError == System.Net.Sockets.SocketError.Success && e.BytesTransferred > 0) { if (session.Server.Options.IOQueueEnabled) @@ -569,6 +582,7 @@ private void SendCompleted(SocketAsyncEventArgs e) ISession session = ex.Session; try { + session.LastSocketError = e.SocketError; if (e.SocketError == SocketError.IOPending || e.SocketError == SocketError.Success) { if (session.Server.EnableLog(LogType.Trace)) @@ -813,13 +827,12 @@ public void Dispose() { ClearSession(); mInitialized = false; - Status = ServerStatus.Closed; foreach (var item in Options.Listens) item.Dispose(); if (mReceiveDispatchCenter != null) mReceiveDispatchCenter.Dispose(); - + Status = ServerStatus.Closed; } diff --git a/src/BeetleX/TcpSession.cs b/src/BeetleX/TcpSession.cs index 29f0a46..eb834ab 100644 --- a/src/BeetleX/TcpSession.cs +++ b/src/BeetleX/TcpSession.cs @@ -164,7 +164,7 @@ protected virtual void OnDispose() if (mSslStream != null) mSslStream.Dispose(); Server.CloseSession(this); - Server = null; + //Server = null; ReceiveDispatcher = null; if (Packet != null) Packet.Dispose(); @@ -259,7 +259,7 @@ internal void InvokeReceiveEvent() Server.SessionReceive(mReceiveArgs); } } - catch(Exception e_) + catch (Exception e_) { if (Server.EnableLog(EventArgs.LogType.Warring)) { @@ -320,8 +320,8 @@ internal void CommitBuffer(IBuffer buffer) catch (Exception e_) { Buffers.Buffer.Free(buffer); - if (Server.EnableLog(EventArgs.LogType.Error)) - Server.Error(e_, this, "{0} session send data error {1}!", this.RemoteEndPoint, e_.Message); + if (Server.EnableLog(EventArgs.LogType.Warring)) + Server.Log(EventArgs.LogType.Warring,this, "{0} session send data error {1}!", this.RemoteEndPoint, e_.Message); } } @@ -411,6 +411,8 @@ public System.IO.Stream Stream public int MaxWaitMessages { get; set; } + public SocketError LastSocketError { get; set; } + public void CreateSSL(AsyncCallback asyncCallback, ListenHandler listen, IServer server) { try @@ -421,7 +423,7 @@ public void CreateSSL(AsyncCallback asyncCallback, ListenHandler listen, IServer mSslStream = new SslStreamX(this.SendBufferPool, server.Options.Encoding, server.Options.LittleEndian, mBaseNetStream, false); - mSslStream.BeginAuthenticateAsServer(listen.Certificate, false, true, new AsyncCallback(asyncCallback), + mSslStream.BeginAuthenticateAsServer(listen.Certificate, false, listen.SslProtocols,true, new AsyncCallback(asyncCallback), new Tuple(this, this.mSslStream)); } catch (Exception e_)