summaryrefslogtreecommitdiff
path: root/CSharp
diff options
context:
space:
mode:
Diffstat (limited to 'CSharp')
-rw-r--r--CSharp/Ivy/IvyPPC/IvyWatcher.cs65
1 files changed, 23 insertions, 42 deletions
diff --git a/CSharp/Ivy/IvyPPC/IvyWatcher.cs b/CSharp/Ivy/IvyPPC/IvyWatcher.cs
index cf84233..d9be71e 100644
--- a/CSharp/Ivy/IvyPPC/IvyWatcher.cs
+++ b/CSharp/Ivy/IvyPPC/IvyWatcher.cs
@@ -26,13 +26,12 @@ namespace IvyBus
/// </remarks>
internal class IvyWatcher
{
- private bool isMulticastAddress = false;
private Ivy bus; /* master bus controler */
- private Socket broadcast; /* supervision socket */// To do reuseaddr we must use a Socket not a udp client
private String domainaddr;
private int port;
private volatile Thread listenThread;
private IPAddress group;
+ private IvyUDPStream stream;
/// <summary> creates an Ivy watcher
/// </summary>
@@ -49,22 +48,24 @@ namespace IvyBus
this.port = port;
listenThread = new Thread(new ThreadStart(this.Run));
listenThread.Name = "Ivy UDP Listener Thread";
- // create the MulticastSocket
try
{
group = IPAddress.Parse(domainaddr);
- broadcast = new Socket(AddressFamily.InterNetwork, SocketType.Dgram,ProtocolType.Udp);
+ /* supervision socket */
+ // To do reuseaddr we must use a Socket not a udp client
+ Socket broadcast = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
IPEndPoint EPhost = new IPEndPoint(IPAddress.Any, port);
broadcast.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast,1);
broadcast.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress,1);
broadcast.Bind(EPhost);
- //test isMulticastAddress // TODO better check
+ //test isMulticastAddress // TODO better check
+ //if ( group.IsIPv6Multicast ) yes but in IPV4 how to do
if ((group.Address & 0xf0000000) == 0xe0000000)
{
- isMulticastAddress = true;
broadcast.SetSocketOption(SocketOptionLevel.Udp, SocketOptionName.AddMembership, new MulticastOption( group ));
}
+ stream = new IvyUDPStream(broadcast);
}
catch (IOException e)
{
@@ -77,12 +78,7 @@ namespace IvyBus
public void Run()
{
traceDebug("beginning of a watcher Thread");
- byte[] buf = new byte[4096];
- int len;
- IPEndPoint remoteEP = new IPEndPoint(IPAddress.Any, 0);
- EndPoint tempRemoteEP = (EndPoint)remoteEP;
-
- remoteEP = null;
+
try
{
bool running = true;
@@ -90,26 +86,22 @@ namespace IvyBus
{
try
{
- len = broadcast.ReceiveFrom(buf, ref tempRemoteEP);
- // I was summoned to leave during the receive
- remoteEP = (IPEndPoint)tempRemoteEP;
+
+ int version;
+ int port;
+ string appId;
+ string appName;
+ IPEndPoint remoteEP;
+
+ stream.receiveMsg(out remoteEP, out version,out port,out appId,out appName);
IPAddress remotehost = remoteEP.Address;
- traceDebug("BUSWATCHER Receive Broadcast from " + Dns.GetHostByAddress(remotehost).HostName+ ":" + remoteEP.Port);
- MemoryStream stream = new MemoryStream( buf,0, len );
- BinaryReader input = new BinaryReader(stream, Encoding.ASCII);
-
- int version = (ushort)IPAddress.NetworkToHostOrder( (short) input.ReadUInt16());
- int port = (ushort)IPAddress.NetworkToHostOrder( (short)input.ReadUInt16() );
- int lenAppId = (ushort)IPAddress.NetworkToHostOrder( (short)input.ReadUInt16() ) ;
- string appId = new String( input.ReadChars(lenAppId));
- int lenAppNameId = (ushort)IPAddress.NetworkToHostOrder( (short)input.ReadUInt16() );
- string appName = new String(input.ReadChars(lenAppNameId));
+ traceDebug("BUSWATCHER Receive Broadcast from " + Dns.GetHostByAddress(remotehost).HostName+ ":" + remoteEP.Port);
//TODO if ( !isInDomain( remotehost ) ) continue;
-
- if (version != Ivy.PROCOCOLVERSION)
+
+ if (version != IvyUDPStream.PROCOCOLVERSION)
{
- Console.Error.WriteLine("Ignoring bad protocol version broadcast");
+ Console.Error.WriteLine("Ignoring bad protocol version {0} expected {1}", version, IvyUDPStream.PROCOCOLVERSION);
continue;
}
@@ -160,7 +152,7 @@ namespace IvyBus
lock(this)
{
traceDebug("begining stopping an IvyWatcher");
- broadcast.Close();
+ stream.Close();
if (listenThread != null)
{
listenThread.Join();
@@ -175,20 +167,9 @@ namespace IvyBus
{
lock(this)
{
- MemoryStream stream = new MemoryStream( 3*2 + bus.AppId.Length + bus.AppName.Length);
- BinaryWriter output = new BinaryWriter(stream,Encoding.ASCII);
- output.Write( (ushort) IPAddress.HostToNetworkOrder( (short)(Ivy.PROCOCOLVERSION )) );
- output.Write( (ushort) IPAddress.HostToNetworkOrder( (short)bus.applicationPort ) );
- output.Write( (ushort) IPAddress.HostToNetworkOrder( (short)bus.AppId.Length ) );
- output.Write( bus.AppId.ToCharArray());
- output.Write( (ushort) IPAddress.HostToNetworkOrder( (short)bus.AppName.Length ) );
- output.Write( bus.AppName.ToCharArray() );
- output.Flush();
-
listenThread.Start();
- byte[] hellob = stream.GetBuffer();
- IPEndPoint EPhost = new IPEndPoint(group, port);
- broadcast.SendTo(hellob,(int) stream.Length,0,EPhost); // notifies our arrival on each domain: protocol version + port
+ IPEndPoint EPhost = new IPEndPoint(group, port);
+ stream.sendMsg(EPhost, bus.applicationPort, bus.AppId, bus.AppName);// notifies our arrival on each domain: protocol version + port
}
}