You are on page 1of 7

Muhammad Sheharyar Raja

201014
BSCYS 7B
Parallel and Distributed Computing

Sir Usama Amir

Task 1:

Code:

using System;
using System.Net;
using System.Net.Sockets;
class Program
{
static void Main()
{
string[] servers =
{
"216.239.35.4" // time.google.com
//... Add more servers if needed
};
DateTime systemTime = DateTime.Now;
foreach (string server in servers)
{
byte[] sntpResponse = GetSntpResponse(server);
if (sntpResponse != null)
{
SntpPacket sntpPacket = new SntpPacket(sntpResponse);
Console.WriteLine($"Time from server {server}:");
sntpPacket.PrintHeaderFields();
sntpPacket.PrintTimestamps();
DateTime transmitTime = sntpPacket.GetTransmitTime();
TimeSpan difference = transmitTime - systemTime;
Console.WriteLine($"Time difference with system time:{ difference.TotalSeconds} seconds");
Console.WriteLine("-----------------------------------");
}
}
}
static byte[] GetSntpResponse(string server)
{
const int port = 123;
const int sntpDataLength = 48;
try
{
IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse(server), port);
using (UdpClient client = new UdpClient())
{
client.Connect(endPoint);
// SNTP request packet - simple mode 3 packet (client mode)
byte[] sntpRequest = new byte[sntpDataLength];
sntpRequest[0] = 0x1B;
client.Send(sntpRequest, sntpRequest.Length);
return client.Receive(ref endPoint);
}
}
catch (Exception ex)
{
Console.WriteLine($"Error fetching time from {server}: {ex.Message}");
return null;
}
}
}
class SntpPacket
{
byte leapIndicator;
byte versionNumber;
byte mode;
byte stratum;
byte pollInterval;
byte precision;
ushort rootDelay;
ushort rootDispersion;
byte[] referenceIdentifier;
ulong referenceTimestamp;
ulong originateTimestamp;
ulong receiveTimestamp;
ulong transmitTimestamp;
public SntpPacket(byte[] data)
{
if (data.Length != 48)
{
throw new ArgumentException("Invalid SNTP response length");
}
this.leapIndicator = (byte)((data[0] >> 6) & 0b11);
this.versionNumber = (byte)((data[0] >> 3) & 0b111);
this.mode = (byte)(data[0] & 0b111);
this.stratum = data[1];
this.pollInterval = data[2];
this.precision = data[3];
this.rootDelay = (ushort)((data[4] << 8) | data[5]);
this.rootDispersion = (ushort)((data[6] << 8) | data[7]);
this.referenceIdentifier = new byte[4];
Array.Copy(data, 12, this.referenceIdentifier, 0, 4);
this.referenceTimestamp = ParseTimestamp(data, 16);
this.originateTimestamp = ParseTimestamp(data, 24);
this.receiveTimestamp = ParseTimestamp(data, 32);
this.transmitTimestamp = ParseTimestamp(data, 40);
}
private ulong ParseTimestamp(byte[] data, int startIndex)
{
ulong seconds = BitConverter.ToUInt32(data, startIndex);
ulong fraction = BitConverter.ToUInt32(data, startIndex + 4);
return (seconds << 32) + fraction;
}
public void PrintHeaderFields()
{
Console.WriteLine("Leap Indicator: " + leapIndicator);
Console.WriteLine("Version Number: " + versionNumber);
Console.WriteLine("Mode: " + mode);
Console.WriteLine("Stratum: " + stratum);
Console.WriteLine("Poll Interval: " + pollInterval);
Console.WriteLine("Precision: " + precision);
Console.WriteLine("Root Delay: " + rootDelay);
Console.WriteLine("Root Dispersion: " + rootDispersion);
Console.WriteLine("Reference Identifier: " +
BitConverter.ToString(referenceIdentifier));
}
public void PrintTimestamps()
{
DateTime epoch = new DateTime(1900, 1, 1);
DateTime referenceTime = epoch.AddSeconds(referenceTimestamp >> 32);
DateTime originateTime = epoch.AddSeconds(originateTimestamp >> 32);
DateTime receiveTime = epoch.AddSeconds(receiveTimestamp >> 32);
DateTime transmitTime = epoch.AddSeconds(transmitTimestamp >> 32);
Console.WriteLine("Reference Timestamp: " + referenceTime);
Console.WriteLine("Originate Timestamp: " + originateTime);
Console.WriteLine("Receive Timestamp: " + receiveTime);
Console.WriteLine("Transmit Timestamp: " + transmitTime);
}
public DateTime GetTransmitTime()
{
DateTime epoch = new DateTime(1900, 1, 1);
return epoch.AddSeconds(transmitTimestamp >> 32);
}
}

Output:

Task 2:
Code:

using System;
using System.Net;
using System.Net.Sockets;

class Program
{
static void Main()
{
string[] servers =
{
"216.239.35.4", // time.google.com
"216.239.35.8", // time1.google.com
"216.239.35.12", // time2.google.com
"162.159.200.1",
"129.134.26.123",
"40.81.94.65",
"129.6.15.28",
"129.6.15.29",
"129.6.15.30",
"132.163.97.1"
//... Add more servers if needed
};

DateTime systemTime = DateTime.Now;

foreach (string server in servers)


{
byte[] sntpResponse = GetSntpResponse(server);
if (sntpResponse != null)
{
SntpPacket sntpPacket = new SntpPacket(sntpResponse);
Console.WriteLine($"Time from server {server}:");
sntpPacket.PrintHeaderFields();
sntpPacket.PrintTimestamps();

DateTime transmitTime = sntpPacket.GetTransmitTime();


TimeSpan difference = transmitTime - systemTime;
Console.WriteLine($"Time difference with system time: {difference.TotalSeconds} seconds");
Console.WriteLine("-----------------------------------");
}
}
}

static byte[] GetSntpResponse(string server)


{
const int port = 123;
const int sntpDataLength = 48;

try
{
IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse(server), port);
using (UdpClient client = new UdpClient())
{
client.Connect(endPoint);

// SNTP request packet - simple mode 3 packet (client mode)


byte[] sntpRequest = new byte[sntpDataLength];
sntpRequest[0] = 0x1B;

client.Send(sntpRequest, sntpRequest.Length);

return client.Receive(ref endPoint);


}
}
catch (Exception ex)
{
Console.WriteLine($"Error fetching time from {server}: {ex.Message}");
return null;
}
}
}

class SntpPacket
{
byte leapIndicator;
byte versionNumber;
byte mode;
byte stratum;
byte pollInterval;
byte precision;
ushort rootDelay;
ushort rootDispersion;
byte[] referenceIdentifier;
ulong referenceTimestamp;
ulong originateTimestamp;
ulong receiveTimestamp;
ulong transmitTimestamp;

public SntpPacket(byte[] data)


{
if (data.Length != 48)
{
throw new ArgumentException("Invalid SNTP response length");
}

this.leapIndicator = (byte)((data[0] >> 6) & 0b11);


this.versionNumber = (byte)((data[0] >> 3) & 0b111);
this.mode = (byte)(data[0] & 0b111);
this.stratum = data[1];
this.pollInterval = data[2];
this.precision = data[3];
this.rootDelay = (ushort)((data[4] << 8) | data[5]);
this.rootDispersion = (ushort)((data[6] << 8) | data[7]);
this.referenceIdentifier = new byte[4];
Array.Copy(data, 12, this.referenceIdentifier, 0, 4);
this.referenceTimestamp = ParseTimestamp(data, 16);
this.originateTimestamp = ParseTimestamp(data, 24);
this.receiveTimestamp = ParseTimestamp(data, 32);
this.transmitTimestamp = ParseTimestamp(data, 40);
}

private ulong ParseTimestamp(byte[] data, int startIndex)


{
ulong seconds = BitConverter.ToUInt32(data, startIndex);
ulong fraction = BitConverter.ToUInt32(data, startIndex + 4);
return (seconds << 32) + fraction;
}

public void PrintHeaderFields()


{
Console.WriteLine("Leap Indicator: " + leapIndicator);
Console.WriteLine("Version Number: " + versionNumber);
Console.WriteLine("Mode: " + mode);
Console.WriteLine("Stratum: " + stratum);
Console.WriteLine("Poll Interval: " + pollInterval);
Console.WriteLine("Precision: " + precision);
Console.WriteLine("Root Delay: " + rootDelay);
Console.WriteLine("Root Dispersion: " + rootDispersion);
Console.WriteLine("Reference Identifier: " + BitConverter.ToString(referenceIdentifier));
}
public void PrintTimestamps()
{
DateTime epoch = new DateTime(1900, 1, 1);
DateTime referenceTime = epoch.AddSeconds(referenceTimestamp >> 32);
DateTime originateTime = epoch.AddSeconds(originateTimestamp >> 32);
DateTime receiveTime = epoch.AddSeconds(receiveTimestamp >> 32);
DateTime transmitTime = epoch.AddSeconds(transmitTimestamp >> 32);

Console.WriteLine("Reference Timestamp: " + referenceTime);


Console.WriteLine("Originate Timestamp: " + originateTime);
Console.WriteLine("Receive Timestamp: " + receiveTime);
Console.WriteLine("Transmit Timestamp: " + transmitTime);
}

public DateTime GetTransmitTime()


{
DateTime epoch = new DateTime(1900, 1, 1);
return epoch.AddSeconds(transmitTimestamp >> 32);
}
}

Output:

You might also like