namespace IvyBus { using System; using System.Collections.Generic; using System.Text; using System.Net; using System.Net.Sockets; using System.IO; abstract class IvyUDPStream: IDisposable { protected MemoryStream out_stream; protected MemoryStream in_stream; private Socket socket; private byte[] buffer; private int protocolVersion; public int ProtocolVersion { get { return protocolVersion; } } public IvyUDPStream(Socket _socket, int protocol) { socket = _socket; buffer = new byte[4096]; in_stream = new MemoryStream(buffer); out_stream = new MemoryStream(); protocolVersion = protocol; } internal void Close() { in_stream.Close(); out_stream.Close(); socket.Shutdown(SocketShutdown.Both); socket.Close(); } internal void receiveMsg(out IPEndPoint remote, out int version, out int 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, int 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(int port, string appId, string appName); abstract internal void Deserialize(out int version, out int port, out string appId, out string appName); #region IDisposable Membres //Implement IDisposable. public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { if (disposing) { // Free other state (managed objects). if (out_stream != null) { out_stream.Close(); out_stream = null; } if (in_stream != null) { in_stream.Close(); in_stream = null; } } // Free your own state (unmanaged objects). // Set large fields to null. } #endregion } }