/// <summary>
        /// Constructs a new <code>OncRpcUdpClient</code> object, which connects
        /// to the ONC/RPC server at <code>host</code> for calling remote procedures
        /// of the given { program, version }.
        /// </summary>
        /// <remarks>
        /// Constructs a new <code>OncRpcUdpClient</code> object, which connects
        /// to the ONC/RPC server at <code>host</code> for calling remote procedures
        /// of the given { program, version }.
        /// <p>Note that the construction of an <code>OncRpcUdpProtocolClient</code>
        /// object will result in communication with the portmap process at
        /// <code>host</code> if <code>port</code> is <code>0</code>.
        /// </remarks>
        /// <param name="host">The host where the ONC/RPC server resides.</param>
        /// <param name="program">Program number of the ONC/RPC server to call.</param>
        /// <param name="version">Program version number.</param>
        /// <param name="port">
        /// The port number where the ONC/RPC server can be contacted.
        /// If <code>0</code>, then the <code>OncRpcUdpClient</code> object will
        /// ask the portmapper at <code>host</code> for the port number.
        /// </param>
        /// <param name="bufferSize">
        /// The buffer size used for sending and receiving UDP
        /// datagrams.
        /// </param>
        /// <exception cref="OncRpcException">if an ONC/RPC error occurs.</exception>
        /// <exception cref="System.IO.IOException">if an I/O error occurs.</exception>
        /// <exception cref="org.acplt.oncrpc.OncRpcException"></exception>
        public OncRpcUdpClient(IPAddress host, int program, int version, int port
                               , int bufferSize, bool useSecurePort) : base(host, program, version, port, OncRpcProtocols
                                                                            .ONCRPC_UDP)
        {
            retransmissionTimeout = base.getTimeout();

            //
            // Construct the inherited part of our object. This will also try to
            // lookup the port of the desired ONC/RPC server, if no port number
            // was specified (port = 0).
            //
            //
            // Let the host operating system choose which port (and network
            // interface) to use. Then set the buffer sizes for sending and
            // receiving UDP datagrams. Finally set the destination of packets.
            //
            if (bufferSize < 1024)
            {
                bufferSize = 1024;
            }
            socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

            if (useSecurePort)
            {
                var localEp = new IPEndPoint(IPAddress.Any, GetLocalPort());
                socket.Bind(localEp);
            }

            if (socket.SendBufferSize < bufferSize)
            {
                socket.SendBufferSize = bufferSize;
            }
            if (socket.ReceiveBufferSize < bufferSize)
            {
                socket.ReceiveBufferSize = bufferSize;
            }
            //
            // Note: we don't do a
            //   socket.connect(host, this.port);
            // here anymore. XdrUdpEncodingStream long since then supported
            // specifying the destination of an ONC/RPC UDP packet when
            // start serialization. In addition, connecting a UDP socket disables
            // the socket's ability to receive broadcasts. Without connecting you
            // can send an ONC/RPC call to the broadcast address of the network
            // and receive multiple replies.
            //
            // Create the necessary encoding and decoding streams, so we can
            // communicate at all.
            //
            sendingXdr   = new XdrUdpEncodingStream(socket, bufferSize);
            receivingXdr = new XdrUdpDecodingStream(socket, bufferSize);
        }
		/// <summary>
		/// Constructs a new <code>OncRpcUdpClient</code> object, which connects
		/// to the ONC/RPC server at <code>host</code> for calling remote procedures
		/// of the given { program, version }.
		/// </summary>
		/// <remarks>
		/// Constructs a new <code>OncRpcUdpClient</code> object, which connects
		/// to the ONC/RPC server at <code>host</code> for calling remote procedures
		/// of the given { program, version }.
		/// <p>Note that the construction of an <code>OncRpcUdpProtocolClient</code>
		/// object will result in communication with the portmap process at
		/// <code>host</code> if <code>port</code> is <code>0</code>.
		/// </remarks>
		/// <param name="host">The host where the ONC/RPC server resides.</param>
		/// <param name="program">Program number of the ONC/RPC server to call.</param>
		/// <param name="version">Program version number.</param>
		/// <param name="port">
		/// The port number where the ONC/RPC server can be contacted.
		/// If <code>0</code>, then the <code>OncRpcUdpClient</code> object will
		/// ask the portmapper at <code>host</code> for the port number.
		/// </param>
		/// <param name="bufferSize">
		/// The buffer size used for sending and receiving UDP
		/// datagrams.
		/// </param>
		/// <exception cref="OncRpcException">if an ONC/RPC error occurs.</exception>
		/// <exception cref="System.IO.IOException">if an I/O error occurs.</exception>
		/// <exception cref="org.acplt.oncrpc.OncRpcException"></exception>
		public OncRpcUdpClient(IPAddress host, int program, int version, int port
			, int bufferSize) : base(host, program, version, port, OncRpcProtocols
			.ONCRPC_UDP)
		{
            retransmissionTimeout = base.getTimeout();

			//
			// Construct the inherited part of our object. This will also try to
			// lookup the port of the desired ONC/RPC server, if no port number
			// was specified (port = 0).
			//
			//
			// Let the host operating system choose which port (and network
			// interface) to use. Then set the buffer sizes for sending and
			// receiving UDP datagrams. Finally set the destination of packets.
			//
			if (bufferSize < 1024)
			{
				bufferSize = 1024;
			}
			socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
			if (socket.SendBufferSize < bufferSize)
			{
				socket.SendBufferSize = bufferSize;
			}
			if (socket.ReceiveBufferSize < bufferSize)
			{
				socket.ReceiveBufferSize = bufferSize;
			}
			//
			// Note: we don't do a
			//   socket.connect(host, this.port);
			// here anymore. XdrUdpEncodingStream long since then supported
			// specifying the destination of an ONC/RPC UDP packet when
			// start serialization. In addition, connecting a UDP socket disables
			// the socket's ability to receive broadcasts. Without connecting you
			// can send an ONC/RPC call to the broadcast address of the network
			// and receive multiple replies.
			//
			// Create the necessary encoding and decoding streams, so we can
			// communicate at all.
			//
			sendingXdr = new XdrUdpEncodingStream(socket, bufferSize);
			receivingXdr = new XdrUdpDecodingStream(socket, bufferSize);
		}