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 8cde5eb..324c4c0 100644
Binary files a/.vs/BeetleX/v15/.suo and b/.vs/BeetleX/v15/.suo differ
diff --git a/src/BeetleX/BeetleX.csproj b/src/BeetleX/BeetleX.csproj
index 057baac..817640a 100644
--- a/src/BeetleX/BeetleX.csproj
+++ b/src/BeetleX/BeetleX.csproj
@@ -5,9 +5,9 @@
henryfan
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_)