public UdpNetworkProtocol(
            Log log,
            Statistics statistics,
            IPEndPoint destinationEndPoint,
            UdpNetworkProtocolType udpNetworkProtocolType,
            int packetDataSize,
            bool verifyOrder)
        {
            _log            = log;
            _statistics     = statistics;
            _packetDataSize = packetDataSize;
            _verifyOrder    = verifyOrder;

            if (verifyOrder && _packetDataSize < PacketNumberTypeLength)
            {
                throw new ArgumentOutOfRangeException(
                          "packetDataSize",
                          packetDataSize,
                          "Order verification require packet size bigger than " + PacketNumberTypeLength + ".");
            }

            _sendBuffer        = Enumerable.Repeat <byte>(0xFE, _packetDataSize).ToArray();
            _listenCancelToken = new CancellationTokenSource();

            DestinationEndPoint = destinationEndPoint;

            SocketType   socketType;
            ProtocolType protocolType;

            switch (udpNetworkProtocolType)
            {
            case UdpNetworkProtocolType.Udp:
                socketType   = SocketType.Dgram;
                protocolType = ProtocolType.Udp;
                break;

            case UdpNetworkProtocolType.Pgm:
                socketType   = SocketType.Rdm;
                protocolType = (ProtocolType)113;
                break;

            default:
                throw new ArgumentOutOfRangeException("udpNetworkProtocolType");
            }

            _socket = new Socket(AddressFamily.InterNetwork, socketType, protocolType);
        }
        public UdpNetworkProtocol(
            Log log,
            Statistics statistics,
            IPEndPoint destinationEndPoint,
            UdpNetworkProtocolType udpNetworkProtocolType,
            int packetDataSize,
            bool verifyOrder)
        {
            _log = log;
              _statistics = statistics;
              _packetDataSize = packetDataSize;
              _verifyOrder = verifyOrder;

              if (verifyOrder && _packetDataSize < PacketNumberTypeLength)
            throw new ArgumentOutOfRangeException(
              "packetDataSize",
              packetDataSize,
              "Order verification require packet size bigger than " + PacketNumberTypeLength + ".");

              _sendBuffer = Enumerable.Repeat<byte>(0xFE, _packetDataSize).ToArray();
              _listenCancelToken = new CancellationTokenSource();

              DestinationEndPoint = destinationEndPoint;

              SocketType socketType;
              ProtocolType protocolType;

              switch (udpNetworkProtocolType)
              {
            case UdpNetworkProtocolType.Udp:
              socketType = SocketType.Dgram;
              protocolType = ProtocolType.Udp;
              break;
            case UdpNetworkProtocolType.Pgm:
              socketType = SocketType.Rdm;
              protocolType = (ProtocolType)113;
              break;
            default:
              throw new ArgumentOutOfRangeException("udpNetworkProtocolType");
              }

              _socket = new Socket(AddressFamily.InterNetwork, socketType, protocolType);
        }