//
// Copyright (c) 2002
// Ronald Kevin Burton
//
// Z poniższym kodem nie jest związana żadna gwarancja poprawności działania.
// Program został dołączony do książki ".NET CLR. Księga eksperta" w celu
// ilustracji koncepcji i zasad przedstawionych w tej książce. Program może być 
// używany na własne ryzyko.
//
// Przyznaje się prawo do użycia lub kopiowania tego oprogramowania do dowolnego celu
// bez konieczności ponoszenia żadnych opłat pod warunkiem, że powyższe uwagi zostaną 
// zachowane we wszystkich kopiach. Przyznaje się także prawo do modyfikacji kodu
// i dystrybucji zmodyfikowanego kodu pod warunkiem zachowania powyższych uwag
// oraz dołączenia informacji mówiącej o modyfikacji kodu.
//
// 
using System;
using System.Threading;
using System.Net;
using System.Net.Sockets;

namespace ProfilingSamples
{
	public class UdpMain 
	{
		private string server;
		private int port;
		UdpMain(string server, int port)
		{
			this.server = server;
			this.port = port;
		}
		void TestThread()
		{
			Socket s = null;
			try
			{
				IPAddress address = Dns.Resolve(server).AddressList[0];
				IPEndPoint remoteEP = new IPEndPoint(address, port);
				EndPoint trEP = (EndPoint)remoteEP;

				s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

				Console.WriteLine("Połączono z serwerem {0}", server);

				byte[] writeBuffer = new byte[2048];
				byte[] readBuffer = new byte[2048];
				int nTransmitted;
				int nReceived;
				int nTotalReceived;

				while(true)
				{
					nTransmitted = s.SendTo(writeBuffer, 0, writeBuffer.Length, SocketFlags.None, remoteEP);
					Console.WriteLine("Wysłano: {0}", nTransmitted);
					nReceived = 0;
					nTotalReceived = 0;
					while(nTotalReceived < nTransmitted)
					{
						Thread.Sleep(100);
						nReceived = s.ReceiveFrom(readBuffer, nReceived, nTransmitted - nTotalReceived, SocketFlags.None, ref trEP);
						Console.WriteLine("Odebrano: {0}", nTransmitted);
						nTotalReceived += nReceived;
					}
				}
			}
			catch(Exception e)
			{
				Console.WriteLine("TestThread przerywa pracę: {0}", e.Message);
			}
			finally
			{
				Console.WriteLine("TestThread finally");
				if(s != null)
					s.Close();
			}
		}
		static void Main(string [] args)
		{
			// Echo na porcie 7.
			UdpMain m = new UdpMain("JILAD", 7);
			Thread testThread = new Thread(new ThreadStart(m.TestThread));
			testThread.Start();
			string input = Console.ReadLine();
			testThread.Abort();
			testThread.Join();
		}
	}
}