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

namespace Bench
{
	/// <summary>
	/// Podsumowanie dla TcpClientTest.
	/// </summary>
	public class TcpClientTest : NetworkTest
	{
		public TcpClientTest(string server, int port, int numberOfPackets, int packetSize) :
			base(server, port, numberOfPackets, packetSize)
		{
		}
		public override void Start()
		{
			TcpClient client = new TcpClient();
			client.Connect(Server, Port);
			NetworkStream stream = client.GetStream();
			byte[] writeBuffer = new byte[PacketSize];
			byte[] readBuffer = new byte[PacketSize];
			int nTransmitted;
			int nReceived;
			int nTotalReceived;

			TransmitByteCount = 0;
			ReceivedByteCount = 0;

			{
				// Wysłanie pewnej liczby bajtów i sprawdzenie,
				// czy jest możliwe odesłanie tych samych danych.
				Random r = new Random();
				r.NextBytes(writeBuffer);
				stream.Write(writeBuffer, 0, writeBuffer.Length);
				nTransmitted = writeBuffer.Length;
				for(nReceived = 0, nTotalReceived = 0; nTotalReceived < nTransmitted;)
				{
					nReceived = stream.Read(readBuffer, nReceived, nTransmitted - nTotalReceived);
					ReceivedByteCount += nReceived;
					nTotalReceived += nReceived;
				}
				for(int i = 0; i < writeBuffer.Length; i++)
				{
					if(writeBuffer[i] != readBuffer[i])
					{
						// Tu leży problem
						return;
					}
				}
			}

			// Wykonanie testu
			StartCounters();
			int startTime = Environment.TickCount;
			for(int i = 0; i < NumberOfPackets; i++)
			{
				// nBytes = stream.Write(writeBuffer, 0, writeBuffer.Length);
				stream.Write(writeBuffer, 0, writeBuffer.Length);
				nTransmitted = writeBuffer.Length;
				TransmitByteCount += nTransmitted;
				for(nReceived = 0, nTotalReceived = 0; nTotalReceived < nTransmitted;)
				{
					nReceived = stream.Read(readBuffer, nReceived, nTransmitted - nTotalReceived);
					ReceivedByteCount += nReceived;
					nTotalReceived += nReceived;
				}
			}
			int endTime = Environment.TickCount;
			StopCounters();

			Elapsed = endTime - startTime;

			client.Close();
		}
	}
}
