From 5e310bef48ed719d15d88aafb9b92e674cb42b96 Mon Sep 17 00:00:00 2001 From: fcolin Date: Mon, 18 Oct 2010 15:42:04 +0000 Subject: utilisation de socket IPV6 si le domain contient un multicast IPV6 genre FF02::1 --- Ivy/IvyClient.cs | 767 ++++++++++++++++++++++++++++--------------------------- 1 file changed, 384 insertions(+), 383 deletions(-) (limited to 'Ivy/IvyClient.cs') diff --git a/Ivy/IvyClient.cs b/Ivy/IvyClient.cs index 98d7901..7a34070 100644 --- a/Ivy/IvyClient.cs +++ b/Ivy/IvyClient.cs @@ -7,17 +7,17 @@ namespace IvyBus { using System; using System.Collections; - using System.Collections.Specialized; - using System.Collections.Generic; + using System.Collections.Specialized; + using System.Collections.Generic; using System.Threading; using System.Text; using System.IO; using System.Net; using System.Net.Sockets; using System.Configuration; - using System.Diagnostics; - using System.Collections.ObjectModel; - using IvyBus.Properties; + using System.Diagnostics; + using System.Collections.ObjectModel; + using IvyBus.Properties; /// A Class for the the peers on the bus. /// @@ -27,19 +27,19 @@ namespace IvyBus /// die messages, direct messages, add or remove regexps, or quit. A thread is /// created for each remote client. /// - public class IvyClient : IvyProtocol, IComparable, IDisposable + public class IvyClient : IvyProtocol, IComparable, IDisposable { - public int CompareTo(IvyClient other) - { - if (other == null) - return clientPriority; - else - return (other.clientPriority - clientPriority); - } - - /// - /// the client application Name - /// + public int CompareTo(IvyClient other) + { + if (other == null) + return clientPriority; + else + return (other.clientPriority - clientPriority); + } + + /// + /// the client application Name + /// public String ApplicationName { get @@ -49,20 +49,20 @@ namespace IvyBus } - //public ReadOnlyCollection Regexps - //{ - // get - // { - // List tab = new List(); - // lock (bindings) - // { - // foreach (IvyBindingBase bind in bindings.Values) - // tab.Add(bind.Expression); - // } - // return new ReadOnlyCollection(tab); - // } + //public ReadOnlyCollection Regexps + //{ + // get + // { + // List tab = new List(); + // lock (bindings) + // { + // foreach (IvyBindingBase bind in bindings.Values) + // tab.Add(bind.Expression); + // } + // return new ReadOnlyCollection(tab); + // } - //} + //} internal int AppPort { get @@ -71,145 +71,146 @@ namespace IvyBus } } - /// - /// adress of the client - /// - public IPAddress RemoteAddress + /// + /// adress of the client + /// + public IPAddress RemoteAddress { get { - return remoteHost; + return remoteHost; } } - /// - /// port of the client - /// + /// + /// port of the client + /// public int RemotePort { get { - return remotePort; + return remotePort; } } private Ivy bus; - //private Dictionary bindings; + //private Dictionary bindings; private int appPort; - private string clientId; /* an unique ID for each IvyClient */ + private string clientId; /* an unique ID for each IvyClient */ private int clientPriority; /* client priority */ - + private volatile Thread clientThread; // volatile to ensure the quick communication - private bool doping; // false by runtime default + private bool doping; // false by runtime default private const int PINGTIMEOUT = 5000; private volatile Thread pingerThread; - private int localPort; + private int localPort; - private int remotePort; - private IPAddress remoteHost; + private int remotePort; + private IPAddress remoteHost; private int readyToSend; - private Object readyToSendLock; + private Object readyToSendLock; // protected variables internal String appName; - internal IvyProtocol stream; + internal IvyProtocol stream; internal IvyClient(Ivy bus, Socket socket, string appname, int appPort) { //bindings = new Dictionary(); this.appName = appname; - this.appPort = appPort; + this.appPort = appPort; this.bus = bus; - readyToSendLock = new Object(); - this.readyToSend = 0; - - // set TCP_NODELAY to lower latency - socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.NoDelay, true); - localPort = ((IPEndPoint)socket.LocalEndPoint).Port; - - IPEndPoint endpoint = (IPEndPoint)socket.RemoteEndPoint; - remoteHost = endpoint.Address; - remotePort = endpoint.Port; - - if ( bus.ProtocolVersion == 4 ) - stream = new IvyTCPStreamV4( socket, this ); - else - stream = new IvyTCPStreamV3(socket, this); + readyToSendLock = new Object(); + this.readyToSend = 0; + + // set TCP_NODELAY to lower latency + //socket.SetSocketOption( SocketOptionLevel.IP, SocketOptionName.NoDelay, true); + socket.NoDelay = true; + localPort = ((IPEndPoint)socket.LocalEndPoint).Port; + + IPEndPoint endpoint = (IPEndPoint)socket.RemoteEndPoint; + remoteHost = endpoint.Address; + remotePort = endpoint.Port; + + if ( bus.ProtocolVersion == 4 ) + stream = new IvyTCPStreamV4( socket, this ); + else + stream = new IvyTCPStreamV3(socket, this); // spawns a thread to manage the incoming traffic on this - // socket. We should be ready to receive messages now. - clientThread = new Thread(new ThreadStart(this.Run)); - clientThread.Name = "Ivy Tcp Client Reader Thread ("+appname+")"; - - bus.addClient(this); - - clientThread.Start(); - - } - - internal void SendBindings() - { - try - { - - // sends our ID, whether we initiated the connexion or not - // the ID is the couple "host name,application Port", the host name - // information is in the socket itself, the port is not known if we - // initiate the connexion - stream.TokenStartRegexp(bus.applicationPort, bus.appName); - // sends our regexps to the peer - lock (bus.bindings) - { - foreach (IvyApplicationBinding bind in bus.bindings.Values) - { - stream.TokenAddBinding(bind.Binding, bind.Key, bind.FormattedExpression); - } - } - // send end of bindings peers can now send ReadyMessage - stream.TokenEndRegexp(); - // try to send Ready Msg - SendReadyToPeer(); + // socket. We should be ready to receive messages now. + clientThread = new Thread(new ThreadStart(this.Run)); + clientThread.Name = "Ivy Tcp Client Reader Thread ("+appname+")"; + + bus.addClient(this); + + clientThread.Start(); + + } + + internal void SendBindings() + { + try + { + + // sends our ID, whether we initiated the connexion or not + // the ID is the couple "host name,application Port", the host name + // information is in the socket itself, the port is not known if we + // initiate the connexion + stream.TokenStartRegexp(bus.applicationPort, bus.appName); + // sends our regexps to the peer + lock (bus.bindings) + { + foreach (IvyApplicationBinding bind in bus.bindings.Values) + { + stream.TokenAddBinding(bind.Binding, bind.Key, bind.FormattedExpression); + } + } + // send end of bindings peers can now send ReadyMessage + stream.TokenEndRegexp(); + // try to send Ready Msg + SendReadyToPeer(); #if (!PocketPC) - doping = Properties.Settings.Default.IvyPing; + doping = Properties.Settings.Default.IvyPing; #endif - if (doping) - { - pingerThread = new Thread(new ThreadStart(PingerRun)); - pingerThread.Name = "Ivy Pinger Thread"; - pingerThread.Start(); - } - - - } - catch (NullReferenceException ex) - { - // the client nous a coupé l'herbe sous le pied - Ivy.traceError(Resources.IvyClient, Resources.IvyClientLeft + " " + appName + " " + ex.Message); - // connexion close in rare concurrent connexion - close(false); - } - catch (ObjectDisposedException ex) - { - // the client nous a coupé l'herbe sous le pied - Ivy.traceError(Resources.IvyClient, Resources.IvyClientLeft + " " + appName + " " + ex.Message); - // invokes the Disconnected applicationListeners - //bus.OnClientDisconnected(new IvyEventArgs(this,id, message )); - // called by the receiver Thread - close(false); - } - catch (IOException ex) - { - // the client nous a coupé l'herbe sous le pied - Ivy.traceError(Resources.IvyClient, Resources.IvyClientLeft + " " + appName + " " + ex.Message); - // invokes the Disconnected applicationListeners - //bus.OnClientDisconnected(new IvyEventArgs(this,id, message )); - // called by the receiver Thread - close(false); - } - - } + if (doping) + { + pingerThread = new Thread(new ThreadStart(PingerRun)); + pingerThread.Name = "Ivy Pinger Thread"; + pingerThread.Start(); + } + + + } + catch (NullReferenceException ex) + { + // the client nous a coupé l'herbe sous le pied + Ivy.traceError(Resources.IvyClient, Resources.IvyClientLeft + " " + appName + " " + ex.Message); + // connexion close in rare concurrent connexion + close(false); + } + catch (ObjectDisposedException ex) + { + // the client nous a coupé l'herbe sous le pied + Ivy.traceError(Resources.IvyClient, Resources.IvyClientLeft + " " + appName + " " + ex.Message); + // invokes the Disconnected applicationListeners + //bus.OnClientDisconnected(new IvyEventArgs(this,id, message )); + // called by the receiver Thread + close(false); + } + catch (IOException ex) + { + // the client nous a coupé l'herbe sous le pied + Ivy.traceError(Resources.IvyClient, Resources.IvyClientLeft + " " + appName + " " + ex.Message); + // invokes the Disconnected applicationListeners + //bus.OnClientDisconnected(new IvyEventArgs(this,id, message )); + // called by the receiver Thread + close(false); + } + + } /// returns the name of the remote agent. /// allow an Ivy package class to access the list of regexps at a @@ -225,11 +226,11 @@ namespace IvyBus /// the string that will be match-tested /// /// - public void SendDirectMsg(int id, string message) + public void SendDirectMsg(int id, string message) { try { - stream.TokenDirectMsg( id, message); + stream.TokenDirectMsg( id, message); } catch (IOException ex) { @@ -237,8 +238,8 @@ namespace IvyBus // first, I'm not a first class IvyClient any more bus.removeClient(this); // invokes the Disconnected applicationListeners - //bus.OnClientDisconnected(new IvyEventArgs(this,id, message )); - // should be called by receiver thread + //bus.OnClientDisconnected(new IvyEventArgs(this,id, message )); + // should be called by receiver thread close(false); } } @@ -252,66 +253,66 @@ namespace IvyBus internal void close(bool notify) { Ivy.traceProtocol(Resources.IvyClient,Resources.Closing + appName); - if (doping ) + if (doping ) { StopPinging(); } if (notify) - try - { - if (stream != null) - stream.TokenBye(0, Resources.ByeMessage); - } - catch (ObjectDisposedException) - { - } - catch (IOException ioe) - { - SocketException se = ioe.InnerException as SocketException; - if (se != null) - { - if (!(se.SocketErrorCode == SocketError.ConnectionReset || - se.SocketErrorCode == SocketError.ConnectionAborted)) - - throw new IvyException(ioe.Message); - } - else - { - throw new IvyException(ioe.Message); - } - - } - // stop the thread and close the stream - if (clientThread == null) - return; - // Tell Thread to stop. - if (stream != null) - { - try - { - stream.Close(); // should stop the Reading Client Thread - } - catch (EndOfStreamException ioe) - { - throw new IvyException(ioe.Message); - } - catch (IOException ioe) - { - throw new IvyException(ioe.Message); - } - //socket.Close(); // pris en charge par stream ( NetWorkStream ) - stream = null; - } - // Potential dead lok when thread issue ClientDisconnected event - //if (Thread.CurrentThread != clientThread && (clientThread != null)) - //{ - // // Wait for Thread to end. - // bool term = clientThread.Join(10000); - // if (!term && (clientThread != null)) clientThread.Abort(); - //} - - clientThread = null; - + try + { + if (stream != null) + stream.TokenBye(0, Resources.ByeMessage); + } + catch (ObjectDisposedException) + { + } + catch (IOException ioe) + { + SocketException se = ioe.InnerException as SocketException; + if (se != null) + { + if (!(se.SocketErrorCode == SocketError.ConnectionReset || + se.SocketErrorCode == SocketError.ConnectionAborted)) + + throw new IvyException(ioe.Message); + } + else + { + throw new IvyException(ioe.Message); + } + + } + // stop the thread and close the stream + if (clientThread == null) + return; + // Tell Thread to stop. + if (stream != null) + { + try + { + stream.Close(); // should stop the Reading Client Thread + } + catch (EndOfStreamException ioe) + { + throw new IvyException(ioe.Message); + } + catch (IOException ioe) + { + throw new IvyException(ioe.Message); + } + //socket.Close(); // pris en charge par stream ( NetWorkStream ) + stream = null; + } + // Potential dead lok when thread issue ClientDisconnected event + //if (Thread.CurrentThread != clientThread && (clientThread != null)) + //{ + // // Wait for Thread to end. + // bool term = clientThread.Join(10000); + // if (!term && (clientThread != null)) clientThread.Abort(); + //} + + clientThread = null; + } @@ -327,34 +328,34 @@ namespace IvyBus int count = 0; - try - { - if (stream != null) - { - stream.TokenMsg(id, args); - count++; - } - } - catch (ObjectDisposedException ex) - { - Ivy.traceError(Resources.IvyClient, Resources.IvyClientLeft + ex.Message); - // first, I'm not a first class IvyClient any more - bus.removeClient(this); //TODO trouble in upper loop iter - // invokes the Disconnected applicationListeners - // in the receiver thread - close(false); - } - catch (IOException ex) - { - Ivy.traceError(Resources.IvyClient, Resources.IvyClientLeft + ex.Message); - // first, I'm not a first class IvyClient any more - bus.removeClient(this); //TODO trouble in upper loop iter - // invokes the Disconnected applicationListeners - // in the receiver thread - close(false); - } + try + { + if (stream != null) + { + stream.TokenMsg(id, args); + count++; + } + } + catch (ObjectDisposedException ex) + { + Ivy.traceError(Resources.IvyClient, Resources.IvyClientLeft + ex.Message); + // first, I'm not a first class IvyClient any more + bus.removeClient(this); //TODO trouble in upper loop iter + // invokes the Disconnected applicationListeners + // in the receiver thread + close(false); + } + catch (IOException ex) + { + Ivy.traceError(Resources.IvyClient, Resources.IvyClientLeft + ex.Message); + // first, I'm not a first class IvyClient any more + bus.removeClient(this); //TODO trouble in upper loop iter + // invokes the Disconnected applicationListeners + // in the receiver thread + close(false); + } - + return count; } @@ -369,9 +370,9 @@ namespace IvyBus /// internal bool sameIvyClient(IvyClient clnt) { - // clientId est null si le protocol n'envoie pas le client ID - if (clnt.clientId != null && this.clientId != null && clnt.clientId == this.clientId) - return true; + // clientId est null si le protocol n'envoie pas le client ID + if (clnt.clientId != null && this.clientId != null && clnt.clientId == this.clientId) + return true; return (this.appPort != 0) && (this.appPort == clnt.appPort) && (this.RemoteAddress.Equals(clnt.RemoteAddress)); } @@ -381,9 +382,9 @@ namespace IvyBus { Ivy.traceProtocol(Resources.IvyClient, Resources.Connected + RemoteAddress + ":" + RemotePort); - Ivy.traceProtocol(Resources.IvyClient,"Thread started"); + Ivy.traceProtocol(Resources.IvyClient,Resources.ThreadStart); - bool running = true; + bool running = true; while ( running && (stream != null) ) { try @@ -397,20 +398,20 @@ namespace IvyBus else { Ivy.traceProtocol(Resources.IvyClient, Resources.BadReceive); - running = false; + running = false; break; } } catch ( ObjectDisposedException ex ) { - Ivy.traceError(Resources.IvyClient, Resources.SocketClosed + ex.Message); + Ivy.traceError(Resources.IvyClient, Resources.SocketClosed + ex.Message); running = false; break; } catch (IvyException ie) { - Ivy.traceError(Resources.IvyClient, Resources.SocketClosed + ie.Message); - running = false; + Ivy.traceError(Resources.IvyClient, Resources.SocketClosed + ie.Message); + running = false; break; } catch (SocketException se) @@ -423,7 +424,7 @@ namespace IvyBus { if ( ex.InnerException is SocketException ) { - Ivy.traceProtocol(Resources.IvyClient, Resources.SocketClosed ); + Ivy.traceProtocol(Resources.IvyClient, Resources.SocketClosed ); } else @@ -435,49 +436,49 @@ namespace IvyBus } } Ivy.traceProtocol(Resources.IvyClient,Resources.Disconnected + appName); - Ivy.traceProtocol(Resources.IvyClient,"Thread stopped"); + Ivy.traceProtocol(Resources.IvyClient,Resources.ThreadStop); // invokes the Disconnected applicationListeners - bus.OnClientDisconnected(new IvyEventArgs(this,0, string.Empty )); + bus.OnClientDisconnected(new IvyEventArgs(this,0, string.Empty )); // first, I'm not a first class IvyClient any more - if (stream != null) - { - stream.Close(); - stream = null; - } + if (stream != null) + { + stream.Close(); + stream = null; + } bus.removeClient(this); } - void IvyProtocol.Close() - { - // never call in this side - } - bool IvyProtocol.ReceiveMsg() - { - // nerver call in this side - return false; - } - void IvyProtocol.TokenDie(int id, string arg) + void IvyProtocol.Close() + { + // never call in this side + } + bool IvyProtocol.ReceiveMsg() + { + // nerver call in this side + return false; + } + void IvyProtocol.TokenDie(int id, string arg) { Ivy.traceProtocol(Resources.IvyClient, Resources.DieReceive + appName + Resources.Reason + arg); // invokes the die applicationListeners - IvyDieEventArgs ev = new IvyDieEventArgs(this, id, arg); - bus.OnDie(ev); - // first, I'm not a first class IvyClient any more - bus.removeClient(this); - // makes the bus die + IvyDieEventArgs ev = new IvyDieEventArgs(this, id, arg); + bus.OnDie(ev); + // first, I'm not a first class IvyClient any more + bus.removeClient(this); + // makes the bus die bus.Stop(); close(false); - if (ev.ForceExit) + if (ev.ForceExit) #if (PocketPC) - System.Windows.Forms.Application.Exit(); + System.Windows.Forms.Application.Exit(); #else System.Environment.Exit(0); #endif } - void IvyProtocol.TokenBye(int err, string arg) + void IvyProtocol.TokenBye(int err, string arg) { // the peer quits - Ivy.traceProtocol(Resources.IvyClient, Resources.ByeReceive + appName + Resources.Reason + arg); + Ivy.traceProtocol(Resources.IvyClient, Resources.ByeReceive + appName + Resources.Reason + arg); // first, I'm not a first class IvyClient any more //bus.removeClient(this); // this is done in the receive thread terminaison!! // invokes the disconnect applicationListeners @@ -485,125 +486,125 @@ namespace IvyBus close(false); // will fire disconnected } - void IvyProtocol.TokenAddBinding(BindingType type, int id, string expression) + void IvyProtocol.TokenAddBinding(BindingType type, int id, string expression) { - if (type == BindingType.RegularExpression && !bus.CheckRegexp(expression)) - { - bus.OnClientFilterBinding(new IvyEventArgs(this, id, expression )); - return; - } - IvyBindingBase bind = null; - try - { - switch (type) - { - case BindingType.RegularExpression: - bind = new IvyBindingRegexp(expression); - break; - case BindingType.Simple: - bind = new IvyBindingSimple(expression); - break; - } - bus.AddBinding(id, this, bind); + if (type == BindingType.RegularExpression && !bus.CheckRegexp(expression)) + { + bus.OnClientFilterBinding(new IvyEventArgs(this, id, expression )); + return; + } + IvyBindingBase bind = null; + try + { + switch (type) + { + case BindingType.RegularExpression: + bind = new IvyBindingRegexp(expression); + break; + case BindingType.Simple: + bind = new IvyBindingSimple(expression); + break; + } + bus.AddBinding(id, this, bind); } catch (ArgumentException ex) { //throw new IvyException("binding expression error " + ex.Message); - stream.TokenError(7, Resources.BadExpression + " "+ ex.Message); + stream.TokenError(7, Resources.BadExpression + " "+ ex.Message); } } - void IvyProtocol.TokenDelBinding(int id) + void IvyProtocol.TokenDelBinding(int id) { - bus.DelBinding(id, this); + bus.DelBinding(id, this); } - void IvyProtocol.TokenMsg(int id, string[] args) + void IvyProtocol.TokenMsg(int id, string[] args) { - bus.OnMessage(new IvyMessageEventArgs(this, id, args)); + bus.OnMessage(new IvyMessageEventArgs(this, id, args)); } - void IvyProtocol.TokenError(int id, string arg) + void IvyProtocol.TokenError(int id, string arg) { - bus.OnError(new IvyEventArgs(this, id, arg)); + bus.OnError(new IvyEventArgs(this, id, arg)); Ivy.traceError(Resources.IvyClient,Resources.ErrorReceive + id + " " + arg); } - - void IvyProtocol.TokenEndRegexp() - { - bus.OnClientConnected(new IvyEventArgs(this, 0, string.Empty)); - /* - * the peer is perhaps not ready to handle this message - * an assymetric processing should be written - */ - SendReadyToPeer(); - } - - private void SendReadyToPeer() - { - lock (readyToSendLock) - { - readyToSend++; - if (bus.ReadyMessage != null && readyToSend == 2) - { - bus.SendMsgToClient(this, bus.ReadyMessage); - } - } - } - void IvyProtocol.TokenStartRegexp(int id, string arg) - { - //bool bindingToSend = appPort == 0; + + void IvyProtocol.TokenEndRegexp() + { + bus.OnClientConnected(new IvyEventArgs(this, 0, string.Empty)); + /* + * the peer is perhaps not ready to handle this message + * an assymetric processing should be written + */ + SendReadyToPeer(); + } + + private void SendReadyToPeer() + { + lock (readyToSendLock) + { + readyToSend++; + if (bus.ReadyMessage != null && readyToSend == 2) + { + bus.SendMsgToClient(this, bus.ReadyMessage); + } + } + } + void IvyProtocol.TokenStartRegexp(int id, string arg) + { + //bool bindingToSend = appPort == 0; appName = arg; appPort = id; - IvyClient target = this; - IvyClient client = bus.checkConnected(this); - if (client != null) - { - // Dilemma choose the rigth client to close - // the symetric processing will try to close each other - // only one side may be closed - //Console.WriteLine(" should close {0} this local {1} rem {2} other local {3} rem {4}", this.appName, this.localPort, this.remotePort, client.localPort, client.remotePort); - if (Math.Max(client.localPort, client.remotePort) > Math.Max( this.localPort, this.remotePort )) - { - target = client; - //Console.WriteLine("choose {0} other ports {1},{2}", target.appName, target.localPort, target.remotePort); - } - else - { - target = this; - //Console.WriteLine("choose {0} this ports {1},{2}", target.appName, target.remotePort, target.localPort); - } - bus.removeClient(target); - target.close(false); - //throw new IvyException(Resources.ConcurrentConnect + " " + appName + " " + clientId); - - } - //if ( bindingToSend && target != this) - // SendBindings(); - + IvyClient target = this; + IvyClient client = bus.checkConnected(this); + if (client != null) + { + // Dilemma choose the rigth client to close + // the symetric processing will try to close each other + // only one side may be closed + //Console.WriteLine(" should close {0} this local {1} rem {2} other local {3} rem {4}", this.appName, this.localPort, this.remotePort, client.localPort, client.remotePort); + if (Math.Max(client.localPort, client.remotePort) > Math.Max( this.localPort, this.remotePort )) + { + target = client; + //Console.WriteLine("choose {0} other ports {1},{2}", target.appName, target.localPort, target.remotePort); + } + else + { + target = this; + //Console.WriteLine("choose {0} this ports {1},{2}", target.appName, target.remotePort, target.localPort); + } + bus.removeClient(target); + target.close(false); + //throw new IvyException(Resources.ConcurrentConnect + " " + appName + " " + clientId); + + } + //if ( bindingToSend && target != this) + // SendBindings(); + } - void IvyProtocol.TokenDirectMsg(int id, string arg) + void IvyProtocol.TokenDirectMsg(int id, string arg) { - bus.OnDirectMessage(new IvyEventArgs(this,id,arg)); + bus.OnDirectMessage(new IvyEventArgs(this,id,arg)); } - void IvyProtocol.TokenPing(int id, string arg) + void IvyProtocol.TokenPing(int id, string arg) { // I receive a ping. I can answer a pong. Ivy.traceProtocol(Resources.IvyClient, Resources.PingReceive + appName + " : " + arg ); stream.TokenPong(id,arg); } - void IvyProtocol.TokenPong(int id, string arg) + void IvyProtocol.TokenPong(int id, string arg) { - Ivy.traceProtocol(Resources.IvyClient, Resources.PingReceive + appName + " : " + arg); + Ivy.traceProtocol(Resources.IvyClient, Resources.PingReceive + appName + " : " + arg); } - /// - /// return full Application name pair - /// + /// + /// return full Application name pair + /// public override String ToString() { return Resources.IvyClient+ " " + bus.appName + ":" + appName; @@ -621,58 +622,58 @@ namespace IvyBus try { Thread.Sleep(PINGTIMEOUT); - int id = (int)DateTime.Now.Ticks; + int id = (int)DateTime.Now.Ticks; stream.TokenPing( id, Resources.PingerThreadMessage); } catch (ThreadAbortException ie) { - Ivy.traceError(Resources.IvyClient,Resources.PingerThreadKilled + ie.Message); + Ivy.traceError(Resources.IvyClient,Resources.PingerThreadKilled + ie.Message); } } Ivy.traceProtocol(Resources.IvyClient,Resources.PingerThreadStopped); } - /// - /// stop the pinger Thread - /// + /// + /// stop the pinger Thread + /// public virtual void StopPinging() { isPinging = false; //pingerThread.Interrupt(); - pingerThread.Abort(); - } - - #region IDisposable Members - - //Implement IDisposable. - public void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - - protected virtual void Dispose(bool disposing) - { - if (disposing) - { - // Free other state (managed objects). - if (stream != null) - { - stream.Close(); - stream = null; - } - } - // Free your own state (unmanaged objects). - // Set large fields to null. - - } - - // Use C# destructor syntax for finalization code. - ~IvyClient() - { - // Simply call Dispose(false). - Dispose(false); - } - - #endregion - } + pingerThread.Abort(); + } + + #region IDisposable Members + + //Implement IDisposable. + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + protected virtual void Dispose(bool disposing) + { + if (disposing) + { + // Free other state (managed objects). + if (stream != null) + { + stream.Close(); + stream = null; + } + } + // Free your own state (unmanaged objects). + // Set large fields to null. + + } + + // Use C# destructor syntax for finalization code. + ~IvyClient() + { + // Simply call Dispose(false). + Dispose(false); + } + + #endregion + } } \ No newline at end of file -- cgit v1.1