summaryrefslogtreecommitdiff
path: root/Ivy/IvyClient.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Ivy/IvyClient.cs')
-rw-r--r--Ivy/IvyClient.cs767
1 files changed, 384 insertions, 383 deletions
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;
/// <summary> A Class for the the peers on the bus.
/// </summary>
@@ -27,19 +27,19 @@ namespace IvyBus
/// die messages, direct messages, add or remove regexps, or quit. A thread is
/// created for each remote client.
/// </remarks>
- public class IvyClient : IvyProtocol, IComparable<IvyClient>, IDisposable
+ public class IvyClient : IvyProtocol, IComparable<IvyClient>, IDisposable
{
- public int CompareTo(IvyClient other)
- {
- if (other == null)
- return clientPriority;
- else
- return (other.clientPriority - clientPriority);
- }
-
- /// <summary>
- /// the client application Name
- /// </summary>
+ public int CompareTo(IvyClient other)
+ {
+ if (other == null)
+ return clientPriority;
+ else
+ return (other.clientPriority - clientPriority);
+ }
+
+ /// <summary>
+ /// the client application Name
+ /// </summary>
public String ApplicationName
{
get
@@ -49,20 +49,20 @@ namespace IvyBus
}
- //public ReadOnlyCollection<string> Regexps
- //{
- // get
- // {
- // List<string> tab = new List<string>();
- // lock (bindings)
- // {
- // foreach (IvyBindingBase bind in bindings.Values)
- // tab.Add(bind.Expression);
- // }
- // return new ReadOnlyCollection<string>(tab);
- // }
+ //public ReadOnlyCollection<string> Regexps
+ //{
+ // get
+ // {
+ // List<string> tab = new List<string>();
+ // lock (bindings)
+ // {
+ // foreach (IvyBindingBase bind in bindings.Values)
+ // tab.Add(bind.Expression);
+ // }
+ // return new ReadOnlyCollection<string>(tab);
+ // }
- //}
+ //}
internal int AppPort
{
get
@@ -71,145 +71,146 @@ namespace IvyBus
}
}
- /// <summary>
- /// adress of the client
- /// </summary>
- public IPAddress RemoteAddress
+ /// <summary>
+ /// adress of the client
+ /// </summary>
+ public IPAddress RemoteAddress
{
get
{
- return remoteHost;
+ return remoteHost;
}
}
- /// <summary>
- /// port of the client
- /// </summary>
+ /// <summary>
+ /// port of the client
+ /// </summary>
public int RemotePort
{
get
{
- return remotePort;
+ return remotePort;
}
}
private Ivy bus;
- //private Dictionary<ushort,IvyBindingBase> bindings;
+ //private Dictionary<ushort,IvyBindingBase> 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<ushort,IvyBindingBase>();
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);
+ }
+
+ }
/// <summary> 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
/// <param name='message'>the string that will be match-tested
///
/// </param>
- 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
/// </returns>
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);
}
- /// <summary>
- /// return full Application name pair
- /// </summary>
+ /// <summary>
+ /// return full Application name pair
+ /// </summary>
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);
}
- /// <summary>
- /// stop the pinger Thread
- /// </summary>
+ /// <summary>
+ /// stop the pinger Thread
+ /// </summary>
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