using System.IO; using System.Text; using System.Net.Sockets; using System.Net; using System; namespace AsterNET.IO { /// /// Socket connection to asterisk. /// public class SocketConnection { private TcpClient tcpClient; private NetworkStream networkStream; private StreamReader reader; private BinaryWriter writer; private Encoding encoding; private bool initial; #region Constructor - SocketConnection(string host, int port, int receiveTimeout) /// /// Consructor /// /// client host /// client port /// encoding public SocketConnection(string host, int port, Encoding encoding) :this(new TcpClient(host, port), encoding) { } /// /// Consructor /// /// client host /// client port /// encoding /// size of the receive buffer. public SocketConnection(string host, int port,int receiveBufferSize, Encoding encoding) : this (new TcpClient(host, port) {ReceiveBufferSize = receiveBufferSize }, encoding) { } #endregion #region Constructor - SocketConnection(socket) /// /// Constructor /// /// TCP client from Listener /// encoding internal SocketConnection(TcpClient tcpClient, Encoding encoding) { initial = true; this.encoding = encoding; this.tcpClient = tcpClient; this.networkStream = this.tcpClient.GetStream(); this.reader = new StreamReader(this.networkStream, encoding); this.writer = new BinaryWriter(this.networkStream, encoding); } #endregion public TcpClient TcpClient { get { return tcpClient; } } public NetworkStream NetworkStream { get { return networkStream; } } public Encoding Encoding { get { return encoding; } } public bool Initial { get { return initial; } set { initial = value; } } #region IsConnected /// /// Returns the connection state of the socket. /// public bool IsConnected { get { return tcpClient.Connected; } } #endregion #region LocalAddress public IPAddress LocalAddress { get { return ((IPEndPoint)(tcpClient.Client.LocalEndPoint)).Address; } } #endregion #region LocalPort public int LocalPort { get { return ((IPEndPoint)(tcpClient.Client.LocalEndPoint)).Port; } } #endregion #region RemoteAddress public IPAddress RemoteAddress { get { return ((IPEndPoint)(tcpClient.Client.RemoteEndPoint)).Address; } } #endregion #region RemotePort public int RemotePort { get { return ((IPEndPoint)(tcpClient.Client.LocalEndPoint)).Port; } } #endregion #region ReadLine() /// /// Reads a line of text from the socket connection. The current thread is /// blocked until either the next line is received or an IOException /// encounters. /// /// the line of text received excluding any newline character /// IOException if the connection has been closed. public string ReadLine() { string line = null; try { line = reader.ReadLine(); } catch { line = null; } return line; } #endregion #region Write(string s) /// /// Sends a given String to the socket connection. /// /// the String to send. /// IOException if the String cannot be sent, maybe because the /// connection has already been closed. public void Write(string s) { writer.Write(encoding.GetBytes(s)); writer.Flush(); } #endregion #region Write(string msg) /// /// Sends a given String to the socket connection. /// /// the String to send. /// IOException if the String cannot be sent, maybe because the /// connection has already been closed. public void WriteEx(string msg) { byte[] data = encoding.GetBytes(msg); networkStream.BeginWrite(data, 0, data.Length, onWriteFinished, networkStream); networkStream.Flush(); } private void onWriteFinished(IAsyncResult ar) { NetworkStream stream = (NetworkStream)ar.AsyncState; stream.EndWrite(ar); } #endregion #region Close /// /// Closes the socket connection including its input and output stream and /// frees all associated ressources.
/// When calling close() any Thread currently blocked by a call to readLine() /// will be unblocked and receive an IOException. ///
/// IOException if the socket connection cannot be closed. public void Close() { try { tcpClient.Client.Shutdown(SocketShutdown.Both); tcpClient.Client.Close(); tcpClient.Close(); } catch { } } #endregion } }