public virtual bool Run(uint port, uint maxBacklog, bool v6Supported) { if (!OnSettingServer()) { return(false); } Type type = GetType(); FieldInfo[] fis = type.GetFields(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.GetField | BindingFlags.Static); foreach (FieldInfo fi in fis) { ServiceAttr[] sas = (ServiceAttr[])fi.GetCustomAttributes(typeof(ServiceAttr), true); if (sas != null && sas.Length > 0) { CBaseService bs = (CBaseService)fi.GetValue(this); if (!bs.AddMe(sas[0].ServiceID, sas[0].ThreadApartment)) { throw new InvalidOperationException("Failed in registering service = " + sas[0].ServiceID + ", and check if the service ID is duplicated with the previous one or if the service ID is less or equal to SocketProAdapter.BaseServiceID.sidReserved"); } } } bool ok = ServerCoreLoader.StartSocketProServer(port, maxBacklog, v6Supported); CBaseService.m_nMainThreads = uint.MaxValue; return(ok); }
private void OnSwitch(ulong hSocket, uint oldServiceId, uint newServiceId) { if (m_nMainThreads == uint.MaxValue) { m_nMainThreads = ServerCoreLoader.GetMainThreads(); } CBaseService bsOld; if (oldServiceId != BaseServiceID.sidStartup && (bsOld = SeekService(oldServiceId)) != null) { bsOld.ReleasePeer(hSocket, false, newServiceId); } CBaseService bsNew = SeekService(newServiceId); if (bsNew != null) { CSocketPeer sp = bsNew.CreatePeer(hSocket, newServiceId); sp.m_bRandom = bsNew.ReturnRandom; if (newServiceId == BaseServiceID.sidHTTP) { CHttpPeerBase hp = (CHttpPeerBase)sp; hp.m_bHttpOk = false; } else { sp.m_os = ServerCoreLoader.GetPeerOs(hSocket, ref sp.m_endian); sp.m_qBuffer.OS = sp.m_os; sp.m_qBuffer.Endian = sp.m_endian; } sp.OnSwitch(oldServiceId); } }
protected override void OnClose(ulong hSocket, int nError) { CBaseService bs = CBaseService.SeekService(hSocket); if (bs != null) { CSocketPeer sp = bs.Seek(hSocket); // ...... } }