using System; using System.Net; using System.Net.Sockets; using System.Text; namespace SSWMS.Server { public delegate void ConnectedEventHandler(BaseSocket socket); public delegate void DisConnectedEventHandler(BaseSocket socket); public delegate void MessageReceivedEventHandler(BaseSocket socket, byte[] message); public class BaseSocket { private readonly byte[] _buffer = new byte[1024]; protected Socket _socket; public string RemoteIP; public int RemotePort; public bool Connected { get { return _socket != null && _socket.Connected; } } public event DisConnectedEventHandler DisConnected; public event MessageReceivedEventHandler MessageReceived; public BaseSocket(Socket socket) { _socket = socket; if (_socket != null) { RemoteIP = (_socket.RemoteEndPoint as IPEndPoint).Address.ToString(); RemotePort = (_socket.RemoteEndPoint as IPEndPoint).Port; } } public void BeginReceive() { try { if (_socket != null) { _socket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(OnReceive), null); } } catch { } } public void OnReceive(IAsyncResult iar) { try { int iReceived = _socket.EndReceive(iar); if (iReceived > 0) { byte[] message = new byte[iReceived]; Array.Copy(_buffer, message, iReceived); if (MessageReceived != null) { MessageReceived.BeginInvoke(this, message, null, null); } _socket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(OnReceive), null); } else { if (DisConnected != null) { DisConnected(this); } } } catch { if (DisConnected != null) { DisConnected(this); } } } public void Dispose() { try { if (_socket != null) { _socket.Dispose(); _socket = null; } } catch { _socket = null; } } public void Send(byte[] message) { try { if (_socket != null) { _socket.Send(message); } } catch { } } public void BeginSend(byte[] message) { try { if (_socket != null) { _socket.BeginSend(message, 0, message.Length, SocketFlags.None, null, null); } } catch { } } public void Send(string message) { try { Send(Encoding.ASCII.GetBytes(message)); } catch { } } public void BeginSend(string message) { try { BeginSend(Encoding.ASCII.GetBytes(message)); } catch { } } } }