From 3593a483d5566779f1d56e037615685cdc77c0a0 Mon Sep 17 00:00:00 2001 From: fcolin Date: Thu, 1 Feb 2007 12:05:47 +0000 Subject: modification structure svn --- IvyPPC/IvyUDPStreamV3.cs | 104 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 IvyPPC/IvyUDPStreamV3.cs (limited to 'IvyPPC/IvyUDPStreamV3.cs') diff --git a/IvyPPC/IvyUDPStreamV3.cs b/IvyPPC/IvyUDPStreamV3.cs new file mode 100644 index 0000000..63a8679 --- /dev/null +++ b/IvyPPC/IvyUDPStreamV3.cs @@ -0,0 +1,104 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Net; +using System.Net.Sockets; +using System.IO; + +namespace IvyBus +{ + class IvyUDPStreamV3 : IvyUDPStream + { + StreamReader input; + StreamWriter output; + + /// the protocol version number + internal const int PROCOCOLVERSION = 3; + + public IvyUDPStreamV3(Socket _socket) : base( _socket , PROCOCOLVERSION ) + { + input = new StreamReader(in_stream, Encoding.ASCII); + output = new StreamWriter(out_stream, Encoding.ASCII); + } + /* + * message Syntax: + * this is a text formated message + * + * message Format: + protocol_version, TCP server port , appId, appName + */ + private ushort DeserializeShort() + { + int read; + ushort ret = 0; + char digit; + // this will eat next non digit car ie space + do + { + read = input.Read(); + if (read < 0) + throw new EndOfStreamException(); + digit = (char)read; + if ( Char.IsDigit(digit) ) + ret = (ushort)(ret * 10 + (digit-0x30)); + } while (Char.IsDigit(digit)); + return ret; + } + private string DeserializeString(char sep) + { + int read; + char car; + StringBuilder str = new StringBuilder(); + // this will eat next non digit car ie space + do + { + read = input.Read(); + if (read < 0) + throw new EndOfStreamException(); + if (read == 0) break; + car = (char)read; + if (car != sep) + str.Append(car); + } while (car != sep); + return str.ToString(); + } + + internal override void Deserialize(out ushort version, out ushort port, out string appId, out string appName) + { + version = 0; + port = 0; + appId = ""; + appName = ""; + try { + version = DeserializeShort(); + port = DeserializeShort(); + //Optionel in V3 protocol depend on client version + appId = DeserializeString(' '); + appName = DeserializeString('\n'); + } + catch( EndOfStreamException ) + { + // Bad protocol message receive or without appId and appName + } + input.DiscardBufferedData(); + } + private void Serialize(ushort arg, char sep) + { + output.Write(arg); + output.Write(sep); + } + private void Serialize(string arg, char sep) + { + output.Write(arg); + output.Write(sep); + } + internal override void Serialize(ushort port, string appId, string appName) + { + Serialize(PROCOCOLVERSION, ' '); + Serialize(port,' '); + Serialize(appId,' '); //No AppId in V3 + Serialize(appName, '\n'); //No Appname in V3 + output.Flush(); + } + } +} -- cgit v1.1