From 5bc49a85da1a5d716bd04ee1cd2a1e70ae716f35 Mon Sep 17 00:00:00 2001 From: Shreyas Zare Date: Sat, 14 Oct 2017 20:15:28 +0530 Subject: [PATCH] DnsServer: added code to ignore ICMP port unreachable responses which creates SocketException in ReceiveFrom(). other minor changes done. --- DnsServerCore/DnsServer.cs | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/DnsServerCore/DnsServer.cs b/DnsServerCore/DnsServer.cs index f0f18a4c..8c0c57cb 100644 --- a/DnsServerCore/DnsServer.cs +++ b/DnsServerCore/DnsServer.cs @@ -35,6 +35,8 @@ namespace DnsServerCore const int TCP_SOCKET_SEND_TIMEOUT = 30000; const int TCP_SOCKET_RECV_TIMEOUT = 60000; + readonly IPEndPoint _localEP; + readonly Socket _udpListener; readonly Thread _udpListenerThread; @@ -65,15 +67,16 @@ namespace DnsServerCore public DnsServer(IPEndPoint localEP) { + _localEP = localEP; _dnsCache = new DnsCache(_cacheZoneRoot); _udpListener = new Socket(AddressFamily.InterNetworkV6, SocketType.Dgram, ProtocolType.Udp); _udpListener.SetSocketOption(SocketOptionLevel.IPv6, SocketOptionName.IPv6Only, false); - _udpListener.Bind(localEP); + _udpListener.Bind(_localEP); _tcpListener = new Socket(AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp); _tcpListener.SetSocketOption(SocketOptionLevel.IPv6, SocketOptionName.IPv6Only, false); - _tcpListener.Bind(localEP); + _tcpListener.Bind(_localEP); _tcpListener.Listen(10); //start reading query packets @@ -131,6 +134,16 @@ namespace DnsServerCore else remoteEP = new IPEndPoint(IPAddress.IPv6Any, 0); + #region this code ignores ICMP port unreachable responses which creates SocketException in ReceiveFrom() + + const uint IOC_IN = 0x80000000; + const uint IOC_VENDOR = 0x18000000; + const uint SIO_UDP_CONNRESET = IOC_IN | IOC_VENDOR | 12; + + _udpListener.IOControl((IOControlCode)SIO_UDP_CONNRESET, new byte[] { Convert.ToByte(false) }, null); + + #endregion + while (true) { bytesRecv = _udpListener.ReceiveFrom(recvBufferStream.Buffer, ref remoteEP); @@ -344,6 +357,9 @@ namespace DnsServerCore #region properties + public IPEndPoint LocalEP + { get { return _localEP; } } + public Zone AuthoritativeZoneRoot { get { return _authoritativeZoneRoot; } }