public Client() { using (FileStream fs = new FileStream("ConfigClient.xml", FileMode.OpenOrCreate)) { Configuration = (Configuration) new XmlSerializer(typeof(Configuration)).Deserialize(fs); client = new UdpClient(); client.ExclusiveAddressUse = false; localEp = new IPEndPoint(IPAddress.Any, Configuration.LocalPort); client.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); client.ExclusiveAddressUse = false; client.Client.Bind(localEp); multicastaddress = IPAddress.Parse(Configuration.IP); client.JoinMulticastGroup(multicastaddress); Console.WriteLine("Настройки загружены!"); } }
private void ProduceMessages() { using var udpClient = new UdpClient(_options.Port, AddressFamily.InterNetwork); #if DEBUG Task.Run(() => { while (true) { Console.WriteLine($"Available packages on {DateTime.Now:T}: {udpClient.Available}"); Thread.Sleep(1000); } }); #endif var address = IPAddress.Parse(_options.IpAddress); udpClient.JoinMulticastGroup(address); var previousMessageNumber = long.MinValue; while (true) { if (_hold > 0) { _resetEvent.WaitOne(); } try { IPEndPoint remoteIp = null; byte[] data = udpClient.Receive(ref remoteIp); using var stream = new MemoryStream(data); var message = Serializer.Deserialize <Message>(stream); _cache.Add(message.Value); if (previousMessageNumber + 1 != message.SequenceNumber) { Interlocked.Increment(ref _lossPackagesCount); } previousMessageNumber = message.SequenceNumber; } catch (Exception e) { ExceptionHandler.Handle(e); } } }
public void Start() { _udpClient = new UdpClient(_port); _udpClient.JoinMulticastGroup(_multiCastGroup, 5); while (true) { if (_nextDelaySeconds > 0) { Thread.Sleep(1000 * _nextDelaySeconds); _udpClient.Dispose(); _udpClient = new UdpClient(_port); _udpClient.JoinMulticastGroup(_multiCastGroup, 5); _nextDelaySeconds = 0; } var data = _udpClient.Receive(ref _ipEndPoint); var number = BitConverter.ToInt32(data, 0); var counter = BitConverter.ToInt32(data, 4); _handler(number, counter); } }