/// <summary> /// Request time from NTP server and calls callback (if success) /// </summary> /// <param name="ntpServerAddress">NTP Server address</param> /// <param name="port">port</param> /// <param name="onRequestComplete">callback (called from other thread!)</param> public static void RequestTimeFromNTP(string ntpServerAddress, int port, Action <DateTime?> onRequestComplete) { NetSocket socket = null; var ntpEndPoint = new NetEndPoint(ntpServerAddress, port); NetManager.OnMessageReceived onReceive = (data, length, code, point) => { if (!point.Equals(ntpEndPoint) || length < 48) { return; } socket.Close(); ulong intPart = (ulong)data[40] << 24 | (ulong)data[41] << 16 | (ulong)data[42] << 8 | (ulong)data[43]; ulong fractPart = (ulong)data[44] << 24 | (ulong)data[45] << 16 | (ulong)data[46] << 8 | (ulong)data[47]; var milliseconds = (intPart * 1000) + ((fractPart * 1000) / 0x100000000L); onRequestComplete(new DateTime(1900, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddMilliseconds((long)milliseconds)); }; //Create and start socket socket = new NetSocket(onReceive); socket.Bind(IPAddress.Any, IPAddress.IPv6Any, 0, false, true, true); //Send request int errorCode = 0; var sendData = new byte[48]; sendData[0] = 0x1B; var sendCount = socket.SendTo(sendData, 0, sendData.Length, ntpEndPoint, ref errorCode); if (errorCode != 0 || sendCount != sendData.Length) { onRequestComplete(null); } }
/// <summary> /// NetManager constructor /// </summary> /// <param name="listener">Network events listener</param> /// <param name="maxConnections">Maximum connections (incoming and outcoming)</param> public NetManager(INetEventListener listener, int maxConnections) { //_logicThread = new Thread(UpdateLogic) { Name = "LogicThread", IsBackground = true }; _socket = new NetSocket(ReceiveLogic); _netEventListener = listener; _netEventsQueue = new FastQueue <NetEvent>(); _netEventsPool = new Stack <NetEvent>(); NetPacketPool = new NetPacketPool(); NatPunchModule = new NatPunchModule(this); Statistics = new NetStatistics(); _peers = new NetPeerCollection(maxConnections); _connectingPeers = new HashSet <NetEndPoint>(); _maxConnections = maxConnections; _updateTimeFilter = new long[3]; // Precreate all needed Merge Packets NetPacketPool.PoolLimit = maxConnections * 100; //NetPacketPool.Prepool(maxConnections * 2, MtuStartIdx >= 0 && MtuStartIdx < NetConstants.PossibleMtu.Length ? NetConstants.PossibleMtu[MtuStartIdx] : (NetConstants.MaxPacketSize - NetConstants.FragmentHeaderSize)); //NetPacketPool.Prepool(maxConnections * 20, 16); }