using System; using System.Collections.Generic; using System.Text; using System.Net; using System.Net.Sockets; using System.IO; namespace IvyBus { abstract class IvyUDPStream { Socket socket; byte[] buffer; protected MemoryStream out_stream; protected MemoryStream in_stream; ushort protocol_version; public ushort ProtocolVersion { get { return protocol_version; } } public IvyUDPStream(Socket _socket, ushort protocol) { socket = _socket; buffer = new byte[4096]; in_stream = new MemoryStream(buffer); out_stream = new MemoryStream(); protocol_version = protocol; } internal void Close() { in_stream.Close(); out_stream.Close(); socket.Shutdown(SocketShutdown.Both); socket.Close(); } internal void receiveMsg(out IPEndPoint remote, out ushort version, out ushort port, out string appId, out string appName) { int len; IPEndPoint remoteEP = new IPEndPoint(IPAddress.Any, 0); EndPoint tempRemoteEP = (EndPoint)remoteEP; remoteEP = null; len = socket.ReceiveFrom(buffer, ref tempRemoteEP); remote = (IPEndPoint)tempRemoteEP; in_stream.Position = 0; in_stream.SetLength(len); in_stream.Seek(0, SeekOrigin.Begin); //Call Deserialization Deserialize( out version, out port, out appId, out appName ); } internal void sendMsg(IPEndPoint EPhost, ushort port, string appId, string appName) { // Call Serialisation Serialize(port, appId, appName); byte[] hellob = out_stream.GetBuffer(); socket.SendTo(hellob, (int)out_stream.Length, 0, EPhost); } abstract internal void Serialize(ushort port, string appId, string appName); abstract internal void Deserialize(out ushort version, out ushort port, out string appId, out string appName); } }