SocketServerBase.cs 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.IO;
  5. using System.Linq;
  6. using System.Net;
  7. using System.Net.Sockets;
  8. using System.Reflection;
  9. using System.Security.Authentication;
  10. using System.Text;
  11. using System.Threading;
  12. using Microsoft.Extensions.Logging;
  13. using SuperSocket.Common;
  14. using SuperSocket.SocketBase;
  15. using SuperSocket.SocketBase.Command;
  16. using SuperSocket.SocketBase.Protocol;
  17. namespace SuperSocket.SocketEngine
  18. {
  19. abstract class SocketServerBase : ISocketServer, IDisposable
  20. {
  21. protected object SyncRoot = new object();
  22. public IAppServer AppServer { get; private set; }
  23. public bool IsRunning { get; protected set; }
  24. protected ListenerInfo[] ListenerInfos { get; private set; }
  25. protected List<ISocketListener> Listeners { get; private set; }
  26. protected bool IsStopped { get; set; }
  27. /// <summary>
  28. /// Gets the sending queue manager.
  29. /// </summary>
  30. /// <value>
  31. /// The sending queue manager.
  32. /// </value>
  33. internal ISmartPool<SendingQueue> SendingQueuePool { get; private set; }
  34. IPoolInfo ISocketServer.SendingQueuePool
  35. {
  36. get { return this.SendingQueuePool; }
  37. }
  38. public SocketServerBase(IAppServer appServer, ListenerInfo[] listeners)
  39. {
  40. AppServer = appServer;
  41. IsRunning = false;
  42. ListenerInfos = listeners;
  43. Listeners = new List<ISocketListener>(listeners.Length);
  44. }
  45. public abstract void ResetSessionSecurity(IAppSession session, SslProtocols security);
  46. public virtual bool Start()
  47. {
  48. IsStopped = false;
  49. ILogger log = AppServer.Logger;
  50. var config = AppServer.Config;
  51. var sendingQueuePool = new SmartPool<SendingQueue>();
  52. sendingQueuePool.Initialize(Math.Max(config.MaxConnectionNumber / 6, 256),
  53. Math.Max(config.MaxConnectionNumber * 2, 256),
  54. new SendingQueueSourceCreator(config.SendingQueueSize));
  55. SendingQueuePool = sendingQueuePool;
  56. for (var i = 0; i < ListenerInfos.Length; i++)
  57. {
  58. var listener = CreateListener(ListenerInfos[i]);
  59. listener.Error += new ErrorHandler(OnListenerError);
  60. listener.Stopped += new EventHandler(OnListenerStopped);
  61. listener.NewClientAccepted += new NewClientAcceptHandler(OnNewClientAccepted);
  62. if (listener.Start(AppServer.Config))
  63. {
  64. Listeners.Add(listener);
  65. log.LogDebug("Listener ({0}) was started", listener.EndPoint);
  66. }
  67. else //If one listener failed to start, stop started listeners
  68. {
  69. log.LogDebug("Listener ({0}) failed to start", listener.EndPoint);
  70. for (var j = 0; j < Listeners.Count; j++)
  71. {
  72. Listeners[j].Stop();
  73. }
  74. Listeners.Clear();
  75. return false;
  76. }
  77. }
  78. IsRunning = true;
  79. return true;
  80. }
  81. protected abstract void OnNewClientAccepted(ISocketListener listener, Socket client, object state);
  82. void OnListenerError(ISocketListener listener, Exception e)
  83. {
  84. var logger = this.AppServer.Logger;
  85. logger.LogError(string.Format("Listener ({0}) error: {1}", listener.EndPoint, e.Message), e);
  86. }
  87. void OnListenerStopped(object sender, EventArgs e)
  88. {
  89. var listener = sender as ISocketListener;
  90. ILogger log = AppServer.Logger;
  91. log.LogDebug("Listener ({0}) was stoppped", listener.EndPoint);
  92. }
  93. protected abstract ISocketListener CreateListener(ListenerInfo listenerInfo);
  94. public virtual void Stop()
  95. {
  96. IsStopped = true;
  97. for (var i = 0; i < Listeners.Count; i++)
  98. {
  99. var listener = Listeners[i];
  100. listener.Stop();
  101. }
  102. Listeners.Clear();
  103. SendingQueuePool = null;
  104. IsRunning = false;
  105. }
  106. #region IDisposable Members
  107. public void Dispose()
  108. {
  109. Dispose(true);
  110. GC.SuppressFinalize(this);
  111. }
  112. protected virtual void Dispose(bool disposing)
  113. {
  114. if (disposing)
  115. {
  116. if (IsRunning)
  117. Stop();
  118. }
  119. }
  120. #endregion
  121. }
  122. }