public static IPAddress GetExternalAddress() { IPHostEntry entry = Dns.GetHostEntry (stunServer); IPEndPoint endPoint = new IPEndPoint (entry.AddressList [0], 3478); UdpClient client = new UdpClient (); client.Connect (endPoint); MessageHeader header = new MessageHeader (); header.MessageType = MessageType.BindingRequest; byte[] bytes = header.GetBytes (); client.Send (bytes, bytes.Length); bytes = client.Receive (ref endPoint); header = new MessageHeader (bytes); if (header.MessageType == MessageType.BindingResponse) { foreach (MessageAttribute attribute in header.MessageAttributes) { if (attribute is MappedAddressAttribute) { return (attribute as AddressAttributeBase).Address; } } throw new Exception ("Resposne was missing Mapped-address!"); } else { throw new Exception ("Wrong response message!"); } }
public static async Task <IPAddress> GetExternalAddressAsync(string server = "stun.ekiga.net") { var entry = await Dns.GetHostEntryAsync(server); var endPoint = new IPEndPoint(entry.AddressList[0], 3478); IPAddress result = null; using (var client = new UdpClient()) { client.Connect(endPoint); // send var header = new MessageHeader() { MessageType = MessageType.BindingRequest }; var bytes = header.GetBytes(); await client.SendAsync(bytes, bytes.Length); // receive header = new MessageHeader((await client.ReceiveAsync()).Buffer); if (header.MessageType != MessageType.BindingResponse) { throw new Exception("Wrong response message!"); } // check message var attr = header.MessageAttributes.OfType <MappedAddressAttribute>().SingleOrDefault(); if (attr == null) { throw new Exception("Response was missing Mapped-address!"); } result = attr.Address; } return(result); }