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

class Sender
{

	public static void Main(string[] args)
	{	
		string address = "localhost";
		if(args.Length == 1)
			address = args[0];

		SendMessage(address);
	}

	public static Socket GetSocket(string host, int port) 
	{
		Socket s = null;
		IPHostEntry iphe = Dns.Resolve(host);
		// Pętla dla wszystkich adresów, a nie tylko
		// pierwszy adres.  
		foreach(IPAddress ipa in iphe.AddressList) 
		{
			IPEndPoint ipe = new IPEndPoint(ipa, port);
		
			// Użycie AddressFamily, która stanowi część
			// punktu końcowego. 
			// AddressFamily.InterNetwork ogranicza
			// do IPv4.
			Socket ts = new Socket(ipe.AddressFamily,
				                   SocketType.Stream,
				                   ProtocolType.Tcp);
			try 
			{
				// Zwrócenie pierwszego gniazda, 
				// z którym można nawiązać połączenie.
				ts.Connect(ipe);
				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 SendMessage(string server)
	{
		Socket s = GetSocket(server, 5000);
		if(s == null)
			return;
		bool continueSending = true;
		while(continueSending)
		{		
			Console.WriteLine("Wprowadź wiadomość do wysłania. Wpisz 'quit', aby wyjść.");
			string message = Console.ReadLine();
			// byte[] buffer = Encoding.ASCII.GetBytes(message);
			byte[] buffer = Encoding.Unicode.GetBytes(message);
			// Poniższe polecenie wysyła cały bufor.
			s.Send(buffer);													
			if(message == "quit")
			{
				continueSending = false;
			}	
		}
		s.Close();
	}
}
