//
// 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.Text;
using System.Net;
using System.Net.Sockets;

class Listener
{

	public static void Main()
	{
		Console.WriteLine("Gotowy do przetwarzania żądań...");
		ProcessRequests();	
	}

	public static Socket GetListenerSocket(string host, int port) 
	{
		Socket s = null;
		IPHostEntry iphe = Dns.Resolve(host);
		foreach(IPAddress ipa in iphe.AddressList) 
		{
			IPEndPoint lep = new IPEndPoint(ipa, port);
			Socket ts = new Socket(lep.AddressFamily,
				                   SocketType.Stream, 
				                   ProtocolType.Tcp);
			try 
			{
				ts.Bind(lep);
				ts.Listen(2);
				s = ts;
				break;
			} 
			catch (ArgumentNullException ae)
			{
				Console.WriteLine("Wyjątek ArgumentNullException: " + ae.ToString());
			}
			catch (SocketException se)
			{				
				Console.WriteLine("Wyjątek SocketException: " + se.ToString());
			}
			catch (Exception e) 
			{
				Console.WriteLine("Połączenie nie powiodło się: " + e.ToString());
			}
		}
		return s;
	}
	public static void ProcessRequests()
	{
		Socket server = GetListenerSocket(Dns.GetHostName(), 5000);
		Socket s = server.Accept();

		byte[] responseData = new byte[128];
		bool continueProcessing = true;

		while(continueProcessing)
		{	
			try
			{
				int bytesRead = s.Receive(responseData);
				// string message = Encoding.ASCII.GetString(responseData, 0, bytesRead);
				string message = Encoding.Unicode.GetString(responseData, 0, bytesRead);
				if(message == "quit")
				{
					continueProcessing = false;
					break;
				}
				else
				{
					Console.WriteLine("Otrzymana wiadomość to " + message);
				}
			}
			catch(Exception ex)
			{
				Console.WriteLine(ex.ToString());
			}
		}
		// Zamknięcie połączenia klienta
		s.Close();
		// Zamknięcie połączenia serwera
		server.Close();
	}
}
