Click here to Skip to main content
15,892,161 members
Articles / Programming Languages / C#

Protocol implementation

Rate me:
Please Sign up or sign in to vote.
2.96/5 (9 votes)
31 Jan 20053 min read 35K   254   24  
Add some protocol support to your server.
using System;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Text;
using System.IO;
using System.Collections;

namespace Infinity.Networking
{
	/// <summary>
	/// Summary description for ClientThread.
	/// </summary>
	public class ClientConnection : IDisposable	
	{
		private const int BUFFERSIZE = 1024;

		private bool _disposed;
		private Socket _clientSocket;
		private Thread _thread;
		private MultiThreadedServerBase _server;

		protected Socket Socket
		{
			get
			{
				return _clientSocket;
			}
		}

		public Thread Thread
		{
			get
			{
				return _thread;
			}
		}

		public ClientConnection(Socket clientSocket , MultiThreadedServerBase server)
		{
			_server = server;
			_disposed = false;
			_clientSocket = clientSocket;

			_thread = new Thread(new ThreadStart(Recieve));

			// start the thread.
			try
			{
				_thread.Start();
			}
			catch(ThreadAbortException abortException)
			{
				Console.WriteLine((string)abortException.ExceptionState);
			}
		}

		~ClientConnection()
		{
			if (!_disposed)
				Dispose();
		}

		internal void Recieve()
		{
			byte[] buffer = new byte[BUFFERSIZE];

			try
			{
				_clientSocket.Receive(buffer,0,buffer.Length,SocketFlags.None);
			}
			catch (SocketException se)
			{
				switch(se.ErrorCode)
				{
					case (int)SocketErrorCodes.ConnectionAborted :
						Dispose();
						break;

					case (int)SocketErrorCodes.ConnectionResetByPeer :
						Dispose();
						break;

					// this is thrown when i need to stop
					// if the server go's down.
					case (int)SocketErrorCodes.InterruptedFunctionCall:
						break;
				}
				return;
			}

			HandleCommand(buffer);
			buffer = null;
		}

		// if i recieved something then it should be handled.
		private void HandleCommand(byte[] data)
		{
			string rxData = Encoding.Default.GetString(data);
			string command = rxData.Trim('\0').Split(' ')[0];

			// check if i got a function for this command
			if (_server.MessageHandlers.Contains(command))
			{

				((NetworkMessageHandler)_server.MessageHandlers[command])
					.DynamicInvoke(new object[]{this,rxData});
			}
			// if not i'll just continue to recieve and do nothing.
			else if (command != "")
			{
				Recieve();
			}
		}

		private string GetString(byte[] data)
		{
			return Encoding.Default.GetString(data);
		}

		public void Dispose()
		{
			if (!_disposed)
			{
				_disposed = true;

				_clientSocket.Close();
				_clientSocket = null;

				_thread.Abort();
				_thread = null;
			}
			else
			{
				new ObjectDisposedException("connection has alraydy been disposed");
			}
		}
	}
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


Written By
Belgium Belgium
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions