All pastes #1482 Raw Edit

Anonymous

public text v1 · immutable
#1482 ·published 2004-10-15 03:30 UTC
rendered paste body
using System;
using System.Collections;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Xml.Serialization;

using TitaniumSoft.Mail;
using TitaniumSoft.Mail.Data;

namespace TitaniumSoft.Sockets
{
	public class SocketServer
	{
		public	ArrayList		connections				= new ArrayList();
		private WaitCallback	_OnAccept;
		private bool			listening				= false;
		private	Socket			listenersocket			= null;
//-------------------------------------------------------------------------------------------
		public SocketServer()
		{
			_OnAccept = new WaitCallback(OnAccept);
		}
//-------------------------------------------------------------------------------------------
		public bool Listening
		{
			get
			{
				return listening;
			}
		}
//-------------------------------------------------------------------------------------------
		public void Listen(string ipaddress, int port)
		{
			IPEndPoint ipendpoint	= new IPEndPoint(IPAddress.Parse(ipaddress), port);
			Socket Listener			= new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
			listenersocket			= Listener;
			try
			{
				Listener.Bind(ipendpoint);
				Listener.Listen((int) SocketOptionName.MaxConnections);
				
				DebugOut("Smtp listening on: " + Listener.LocalEndPoint.ToString(), false);
			}
			catch(Exception e)
			{
				DebugOut("Smtp failed to bind: " + e.Message, true);
				return;
			}
			
			while (!Listening && !Environment.HasShutdownStarted)
			{
				try 
				{
					ThreadPool.QueueUserWorkItem(_OnAccept, Listener.Accept());
				}
				catch 
				{
					Thread.Sleep(100);
				}
			}

			Listener.Shutdown(SocketShutdown.Both);
			Listener.Close();
		}
//-------------------------------------------------------------------------------------------
		public virtual void OnAccept(Object pSock)
		{
			Socket socket		= (Socket) pSock;
			SocketClient client = new SocketClient(socket);
			try
			{
				connections.Add(client);
			}
			catch (Exception e)
			{
				DebugOut("Unknown error:\r\n\r\n" + e.ToString(), true);
				if (client != null)
				{
					client.Disconnect();
				}
				try
				{
					client = null;
				}
				catch
				{
				}
			}
		}
//-------------------------------------------------------------------------------------------
		public void StopListening()
		{
			listening = false;
			try
			{
				listenersocket.Close();
			}
			catch {}
		}
		//-------------------------------------------------------------------------------------------
		public void DebugOut(string data, bool error)
		{
		}
	}
}