SocketServerBase.cs 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  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 SuperSocket.Common;
  13. using SuperSocket.SocketBase;
  14. using SuperSocket.SocketBase.Command;
  15. using SuperSocket.SocketBase.Logging;
  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. ILog 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. if (log.IsDebugEnabled)
  66. {
  67. log.DebugFormat("Listener ({0}) was started", listener.EndPoint);
  68. }
  69. }
  70. else //If one listener failed to start, stop started listeners
  71. {
  72. if (log.IsDebugEnabled)
  73. {
  74. log.DebugFormat("Listener ({0}) failed to start", listener.EndPoint);
  75. }
  76. for (var j = 0; j < Listeners.Count; j++)
  77. {
  78. Listeners[j].Stop();
  79. }
  80. Listeners.Clear();
  81. return false;
  82. }
  83. }
  84. IsRunning = true;
  85. return true;
  86. }
  87. protected abstract void OnNewClientAccepted(ISocketListener listener, Socket client, object state);
  88. void OnListenerError(ISocketListener listener, Exception e)
  89. {
  90. var logger = this.AppServer.Logger;
  91. if(!logger.IsErrorEnabled)
  92. return;
  93. logger.Error(string.Format("Listener ({0}) error: {1}", listener.EndPoint, e.Message), e);
  94. }
  95. void OnListenerStopped(object sender, EventArgs e)
  96. {
  97. var listener = sender as ISocketListener;
  98. ILog log = AppServer.Logger;
  99. if (log.IsDebugEnabled)
  100. log.DebugFormat("Listener ({0}) was stoppped", listener.EndPoint);
  101. }
  102. protected abstract ISocketListener CreateListener(ListenerInfo listenerInfo);
  103. public virtual void Stop()
  104. {
  105. IsStopped = true;
  106. for (var i = 0; i < Listeners.Count; i++)
  107. {
  108. var listener = Listeners[i];
  109. listener.Stop();
  110. }
  111. Listeners.Clear();
  112. SendingQueuePool = null;
  113. IsRunning = false;
  114. }
  115. #region IDisposable Members
  116. public void Dispose()
  117. {
  118. Dispose(true);
  119. GC.SuppressFinalize(this);
  120. }
  121. protected virtual void Dispose(bool disposing)
  122. {
  123. if (disposing)
  124. {
  125. if (IsRunning)
  126. Stop();
  127. }
  128. }
  129. #endregion
  130. }
  131. }