|
/*
* Genesis Socket Server and Client
* (C)Copyright 2005/2006 Robert Harwood <robharwood@runbox.com>
*
* Please see included license.txt file for information on redistribution and usage.
*/
using System;
using System.Collections;
namespace GenesisCore
{
internal class TimeoutEntry
{
public string ServerIP;
public int ServerPort;
public DateTime TimeoutTime;
public string ConnectionRequestID;
}
/// <summary>
/// Connection timeout list, holds all connections that we have tried to
/// establish and allows the system to detect unresponsive hosts.
/// </summary>
internal class ConnTimeout : CollectionBase
{
private GenesisUDP m_Parent;
public ConnTimeout(GenesisUDP parent)
{
m_Parent = parent;
}
/// <summary>
/// Generates a new request ID number.
/// </summary>
public string GetNewRequestID( )
{
//Generate a random conection request number
Random r = new Random(DateTime.Now.Millisecond);
string newnum = r.Next( ).ToString();
Connection cn;
//Make sure we dont get any ID clashes with another connection request (unlikely but just in case).
while(EntryExists(newnum) || (m_Parent.Servers.ConnectionByRequestID(newnum, out cn) != GenesisConsts.UDP_NOTFOUND))
newnum = r.Next( ).ToString();
return newnum;
}
/// <summary>
/// Adds a connection into the timeout list
/// </summary>
public void AddConnectionEntry(string IP, int Port, int TimeoutSecs, string RequestID)
{
lock(List.SyncRoot)
{
//Remove any existing connection attempt to this IP/Port.
if(EntryExists(IP, Port))
RemoveConnectionEntry(IP, Port);
//Create the entry
TimeoutEntry toe = new TimeoutEntry( );
toe.ServerIP = IP;
toe.ServerPort = Port;
toe.TimeoutTime = DateTime.Now.AddSeconds(TimeoutSecs);
toe.ConnectionRequestID = RequestID;
//Add to the list
List.Add(toe);
}
}
/// <summary>
/// Returns whether or not a connection reauest exists based on its unique request ID.
/// </summary>
public bool EntryExists(string RequestID)
{
lock(List.SyncRoot)
{
for(int i = 0; i < List.Count; i++)
{
TimeoutEntry toe = List[i] as TimeoutEntry;
if(toe == null)
continue;
if(toe.ConnectionRequestID == RequestID)
return true;
}
}
return false;
}
/// <summary>
/// Finds out whether a time out entry exists or not.
/// </summary>
public bool EntryExists(string IP, int Port)
{
lock(List.SyncRoot)
{
for(int i = 0; i < List.Count; i++)
{
TimeoutEntry toe = List[i] as TimeoutEntry;
if(toe == null)
continue;
if((toe.ServerIP == IP) && (toe.ServerPort == Port))
return true;
}
}
return false;
}
/// <summary>
/// Removes a connection from the timeout list
/// </summary>
public void RemoveConnectionEntry(string IP, int Port)
{
lock(List.SyncRoot)
{
for(int i = 0; i < List.Count; i++)
{
TimeoutEntry toe = List[i] as TimeoutEntry;
if(toe == null)
continue;
if((toe.ServerIP == IP) && (toe.ServerPort == Port))
{
List.Remove(toe);
return;
}
}
}
}
/// <summary>
/// Removes a connection from the timeout list
/// </summary>
public void RemoveConnectionEntry(string request_id)
{
lock(List.SyncRoot)
{
for(int i = 0; i < List.Count; i++)
{
TimeoutEntry toe = List[i] as TimeoutEntry;
if(toe == null)
continue;
if(toe.ConnectionRequestID == request_id)
{
List.Remove(toe);
return;
}
}
}
}
/// <summary>
/// Removes all connection timeout entries
/// </summary>
public void RemoveAllEntries( )
{
lock(List.SyncRoot)
{
List.Clear( );
}
}
/// <summary>
/// Checks the timeout entrys for any that have expired.
/// </summary>
public void CheckTimeouts( )
{
lock(List.SyncRoot)
{
if(List.Count == 0)
return;
for(int i = 0; i < List.Count; i++)
{
TimeoutEntry toe = List[i] as TimeoutEntry;
if(toe == null)
continue;
if(toe.TimeoutTime < DateTime.Now)
{
m_Parent.ConnectionRequestTimedOut(toe.ServerIP, toe.ServerPort, toe.ConnectionRequestID);
List.Remove(toe);
return;
}
}
}
}
}
}
|
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.
Born in England, I have been programming since a very early age when my dad gave me prewritten programs to type in and run on a Sinclair ZX81 machine (seeing my name printed out on a TV screen was enough to keep me entertained!). I later did work using basic and STOS basic on the Atari ST and after that got my first PC and used Microsoft's QBasic. Later when I was about 13 I was in an airport and saw a trial copy of Visual Basic on a magazine, which I bought and it got me hooked on the Microsoft development tools.
Currently I am studying a software engineering degree and have been working with .NET since 1.0. I have just moved over to Visual Studio 2005/.NET 2.0 and am loving it! During my degree I have worked for a year at DuPont, where I ended up changing a lot of their old existing software over to .NET and improving it in the process! Since then I have been back and done some consulting work involving maintaining some of their older C++/MFC software.
While most of my current interestes involve .NET I am also confident in working with C++ in Win32, VB, Java, and have even done some development work on the Linux platform (although most of this involved ensuring that software I wrote in C++ was platform independent).
I have a strong passion for software technology, both higher level and more recently, systems level stuff (the dissertation I am doing for my degree is to implement a small compiler and virtual machine in C# for a Pascal-style language).