SuperSocket中的Server的初始化和启动
一、初始化的过程
static void Main(string[] args) { var bootstrap = BootstrapFactory.CreateBootstrap(); if (!bootstrap.Initialize()) { Console.WriteLine("Failed to initialize!"); Console.ReadKey(); return; } }
supersocket\socketengine\defaultbootstrap.cs
DefaultBootStrap.cs public virtual bool Initialize() { return Initialize(c => c); } public virtual bool Initialize(Func<IServerConfig, IServerConfig> serverConfigResolver) { return Initialize(serverConfigResolver, null); } public virtual bool Initialize(Func<IServerConfig, IServerConfig> serverConfigResolver, ILogFactory logFactory) { foreach (var factoryInfo in workItemFactories) { IWorkItem appServer = InitializeAndSetupWorkItem(factoryInfo); } } private IWorkItem InitializeAndSetupWorkItem(WorkItemFactoryInfo factoryInfo) { setupResult = SetupWorkItemInstance(appServer, factoryInfo); } internal virtual bool SetupWorkItemInstance(IWorkItem workItem, WorkItemFactoryInfo factoryInfo) { return workItem.Setup(this, factoryInfo.Config, factoryInfo.ProviderFactories.ToArray()); }
supersocket\socketbase\appserverbase.cs
bool IWorkItem.Setup(IBootstrap bootstrap, IServerConfig config, ProviderFactoryInfo[] factories) { Bootstrap = bootstrap; if (!SetupFinal()) return false; } private bool SetupFinal() { return SetupSocketServer(); } private bool SetupSocketServer() { m_SocketServer = m_SocketServerFactory.CreateSocketServer<TRequestInfo>(this, m_Listeners, Config); }
supersocket\socketengine\socketserverfactory.cs
public ISocketServer CreateSocketServer<TRequestInfo>(IAppServer appServer, ListenerInfo[] listeners, IServerConfig config) where TRequestInfo : IRequestInfo { case(SocketMode.Tcp): return new AsyncSocketServer(appServer, listeners); }
二、启动的过程
var bootstrap = BootstrapFactory.CreateBootstrap(); var result = bootstrap.Start();
supersocket\socketengine\defaultbootstrap.cs
//Initialize servers
foreach (var factoryInfo in workItemFactories)
{
IWorkItem appServer = InitializeAndSetupWorkItem(factoryInfo);
if (appServer == null)
return false;
if (factoryInfo.IsServerManager)
serverManager = appServer;
else if (!(appServer is IsolationAppServer))//No isolation
{
//In isolation mode, cannot check whether is server manager in the factory info loader
if (TypeValidator.IsServerManagerType(appServer.GetType()))
serverManager = appServer;
}
m_AppServers.Add(appServer);
}
public StartResult Start() { foreach (var server in m_AppServers) { if (!server.Start()) {} } }
supersocket\socketbase\appserver.cs
public override bool Start() { if (!base.Start()) return false; }
supersocket\socketbase\appserverbase.cs
m_SocketServer = m_SocketServerFactory.CreateSocketServer<TRequestInfo>(this, m_Listeners, Config);
public virtual bool Start() { if (!m_SocketServer.Start()) { m_StateCode = ServerStateConst.NotStarted; return false; } }
SuperSocket\SocketEngine\AsyncSocketServer.cs
public override bool Start() { if (!base.Start()) return false; }
supersocket\socketengine\socketserverbase.cs
var listener = CreateListener(ListenerInfos[i]);
d:\sourcecode\github\supersocket\socketengine\tcpsocketserverbase.cs
protected override ISocketListener CreateListener(ListenerInfo listenerInfo)
{
return new TcpAsyncSocketListener(listenerInfo);
}
d:\sourcecode\github\supersocket\socketengine\tcpasyncsocketlistener.cs
public TcpAsyncSocketListener(ListenerInfo info)
: base(info)
{
m_ListenBackLog = info.BackLog;
}
d:\sourcecode\github\supersocket\socketengine\socketlistenerbase.cs
protected SocketListenerBase(ListenerInfo info)
{
Info = info;
}
public SocketServerBase(IAppServer appServer, ListenerInfo[] listeners)
{
AppServer = appServer;
IsRunning = false;
ListenerInfos = listeners;
Listeners = new List<ISocketListener>(listeners.Length);
}
public TcpSocketServerBase(IAppServer appServer, ListenerInfo[] listeners)
: base(appServer, listeners)
public virtual bool Start() { if (listener.Start(AppServer.Config)) { } }
SuperSocket\SocketEngine\TcpAsyncSocketListener.cs
d:\sourcecode\github\supersocket\socketengine\socketlistenerbase.cs
public ListenerInfo Info { get; private set; }
protected SocketListenerBase(ListenerInfo info)
{
Info = info;
}
public override bool Start(IServerConfig config) { m_ListenSocket = new Socket(this.Info.EndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp); if (!m_ListenSocket.AcceptAsync(acceptEventArg)) ProcessAccept(acceptEventArg); }
相关文章
- SQL Server 2016将内置R语言
- 在虚拟机安装 Linux Server (ubuntu-14.04-server)
- CDH断电后cloudera-scm-server启动报错
- 解决 CDH6 启动 cloudera-scm-server 失败问题
- windows server服务器CICD自动化脚本
- 解决K8s报错:Error: error installing: the server could not find the requested resource
- windows server 2008 w3svc服务无法启动,错误 1068依赖服务或组件无法启动
- django启动server报错Error: That port is already in use.
- Wikibon坚持server SAN主导论
- Mysql 5.7源码编译启动 报error问题:The server quit without updating PID file (/data/data_mysql/mysql.pid).
- Ubuntu18.04server 双网卡,开机自动设置路由并启动校园网网络认证程序(Ubuntu开机自动设置路由,开机自启动应用程序)
- Ubuntu Server无桌面无显示器情况下虚拟屏幕xvfb的安装及设置—ubuntu18.04server服务器系统下为python安装虚拟显示器 (使用jupyter notebook在web端播放openai的gym下保存的运行视频——需安装ipython)
- [转发]ASP.NET Core2集成Office Online Server(OWAS)实现办公文档的在线预览与编辑(支持wordexcelpptpdf等格式)
- 深入浅出的 SQL Server 查询优化
- JBoss 7/WildFly Domain 模式怎样配置 Server 启动的 JVM 參数
- sql server启动报错 TDSSNIClient 初始化失败,出现错误 0xffffffff,状态代码 0x80。原因: Unable to initialize SSL support.
- SQL Server SSPI handshake failed报错,sql server修改windows账户密码的影响,sql server订阅发布客户端访问一直报错
- 【sql server压测】sql server使用Diskspd测试SQL Server IO存储
- sql server该账户当前被锁定,所以用户'sa'登录失败。系统管理员无法将该账户解锁。(Microsoft SQL Server,错误:18486),登录错误18456
- sql server作业报错:从ICassFactory为CLSID为{17BCA6E8-A950-497E-B2F9-AF6AA475916F}的COM组件创建实例失败,原因是出现以下错误:c001f011.(Microsoft.Server.manageDTS)
- 【sql server安装错误】sql server安装错误 无法找到数据库引擎启动句柄
- sql server中的工作线程
- 单用户模式启动SQL Server实例总结
- SQL Server误删表查看
- (1)sql server 同网段复制
- 曹工说Redis源码(3)-- redis server 启动过程完整解析(中)
- sql server 变量声明、设置、使用、输出
- 启动zabbix-server报缺少libmysqlclient.so.18