All pastes #23357 Raw Edit

Untitled

public text v1 · immutable
#23357 ·published 2005-09-19 16:42 UTC
rendered paste body
// UDTimeClient.cs

// Synchronous UDP TIME client code example.  Prepared for
// Virginia Tech ECE 4564 by Scott Midkiff (9/15/05).  Contact
// midkiff@vt.edu.

// Arguments:  [server [port]]
// The optional server parameter is the server hostname or IP
// address.  If the server is specified, the optional port
// parameter can be used to specify the server port.  The
// defaults are "localhost" and port 37.

// The client gets a 32-bit value from the server, which is
// the number of seconds since the Internet time epoch of
// midnight on January 1, 1900.


using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;


namespace UDP_Time_Client{
	
	public class UDPTimeClient{


		// Define a method to convert a 32-bit unsigned integer,
		// stored in a byte array, into an Int64, a 64-bit integer).
		// (There may be a better way to do this with a built-in
		// function, but I've not discovered it.)
		static Int64 BytesToInt64(byte[] bytes4)
		{
			Int64 value64 = (uint)bytes4[3];

			for (int i = 2; i >= 0; i--)
			{
				value64 = value64 << 8;
				value64 = value64 | bytes4[i];
			}

			return (value64);
		}
		

		public static int Main(String[] args){

			// Buffer for "dummy" message to server.
			byte[] msg = new byte[1];

			// Buffer for 32-bit response from the server
			byte[] bytes = new byte[4];

			try{

				// By default, use localhost as the server host and port 37
				// as the server port.  Allow these to be altered by command
				// line arguments, as noted above.
				IPAddress ipAddress = IPAddress.Loopback;
				Int32 sServPort = 37;

				if (args.Length > 0)
				{
					// Optional server host is specified.  First, see if we can
					// parse the server name as an IP address.  If not, then we
					// use DNS to do a host name lookup.
					if (!IPAddress.TryParse(args[0], out ipAddress))
					{
						IPHostEntry ipHostInfo = Dns.GetHostEntry(args[0]);
						ipAddress = ipHostInfo.AddressList[0];
					}
				}
				if (args.Length > 1)
				{
					// Convert IP address to dot decimal format and port to unsigned short
					sServPort = Convert.ToInt32(args[1]);
				}

				//Create endpoint for server.
				IPEndPoint remoteEP = new IPEndPoint(ipAddress, sServPort);
		
				// Create a UDP/IP  socket.
				Socket clientSocket = new Socket(AddressFamily.InterNetwork,
					SocketType.Dgram, ProtocolType.Udp );

				// Display the server endpoint information.
				Console.WriteLine("UDP Time Client");
				Console.WriteLine("Using server at:  {0}", remoteEP.ToString());

				// Generate a "dummy" message.
				msg[0] = 0; 
			
				// Send zero-byte message to server.
				clientSocket.SendTo(msg, 0, SocketFlags.None, remoteEP);

				// Receive the response from the server.
				EndPoint senderEP = (EndPoint) remoteEP;
				int bytesRec = clientSocket.ReceiveFrom(bytes, bytes.Length, SocketFlags.None, ref senderEP);
				
				// Convert to a 64-bit integer.
				Int64 serverTime = BytesToInt64(bytes);

				// Convert to time string.  Start with Internet time epoch of
				// January 1, 1900 at 12:00 a.m. (or time 00:00).  Then add the
				// difference provided by the server.
				DateTime theTime = new DateTime(1900, 1, 1, 0, 0, 0);
				theTime = theTime.AddSeconds(serverTime);
				
				// Display time.
				Console.Write(theTime.ToString());

				// Release the socket.
				clientSocket.Close();

			}catch (ArgumentNullException ane){
				Console.WriteLine("ArgumentNullException: {0}",ane.ToString());
			}catch (SocketException se){
				Console.WriteLine("SocketException: {0}",se.ToString());
			}catch (Exception e){
				Console.WriteLine("Unexpected exception: {0}", e.ToString());
			}

			// Pause.
			Console.WriteLine("\npress ENTER to continue...");
			Console.ReadLine();

			return 0;
		}
	}
}