| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182 | using System;using System.Collections.Generic;using System.Linq;using System.Net;using System.Net.Sockets;using System.Text;using System.Threading.Tasks;namespace EPD.Data{    public class SocketClientWrapper : IDisposable    {        public Action OnConnected;        public Action OnDisconnected;        public Action<byte[] /*data*/, int /*offset*/, int /*size*/> OnDataChanged;        private static Object _lockerSender = new Object();        public class ClientStateObject        {            public const int BufferSize = 16384;            public Socket WorkSocket = null;            public byte[] CacheBufferByteData = new byte[BufferSize];        }        private Socket socket;        public bool IsConnected { get { return socket != null && socket.Connected; } }        public SocketClientWrapper()        {        }        ~SocketClientWrapper()        {            Dispose();        }        /// <summary>        ///         /// </summary>        /// <param name="address">127.0.0.1:15000</param>        public void Connect(string ip, int port)        {            try            {                var remote = new IPEndPoint(IPAddress.Parse(ip), port);                Dispose();                socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);                socket.BeginConnect(remote, ConnectCallback, socket);            }            catch (Exception ex)            {                System.Diagnostics.Trace.Write("Error in Connect, " + ex.Message);            }        }        private void ConnectCallback(IAsyncResult ar)        {            try            {                var client = (Socket)ar.AsyncState;                client.EndConnect(ar);                if (OnConnected != null)                    OnConnected();                System.Diagnostics.Trace.Write("Connected");                var state = new ClientStateObject();                state.WorkSocket = socket;                socket.BeginReceive(state.CacheBufferByteData, 0, ClientStateObject.BufferSize, 0, ReceiveCallback, state);            }            catch (Exception ex)            {                System.Diagnostics.Trace.Write("Error in ConnectCallback, " + ex.Message);            }        }        public void Disconnect()        {            Dispose();            if (OnDisconnected != null)                OnDisconnected();        }        private void ReceiveCallback(IAsyncResult ar)        {            try            {                if (!IsConnected)                    return;                ClientStateObject state = (ClientStateObject)ar.AsyncState;                Socket client = state.WorkSocket;                int bytesRead = client.EndReceive(ar);                if (bytesRead > 0)                {                    if (OnDataChanged != null)                        OnDataChanged(state.CacheBufferByteData, 0, bytesRead);                    client.BeginReceive(state.CacheBufferByteData, 0, ClientStateObject.BufferSize, 0, new AsyncCallback(ReceiveCallback), state);                }            }            catch (Exception ex)            {                System.Diagnostics.Trace.Write("Error in ReceiveCallback, " + ex.Message);                Disconnect();            }        }        public bool Send(byte[] byteData)        {            try            {                if (!IsConnected)                    return false;                lock (_lockerSender)                {                    socket.BeginSend(byteData, 0, byteData.Length, 0, new AsyncCallback(SendCallback), socket);                }                return true;            }            catch (Exception ex)            {                System.Diagnostics.Trace.Write("Error int Write, " + ex.Message);            }            return false;        }        private void SendCallback(IAsyncResult ar)        {            try            {                lock (_lockerSender)                {                    Socket client = (Socket)ar.AsyncState;                    client.EndSend(ar);                }            }            catch (Exception ex)            {                System.Diagnostics.Trace.Write("Error in SendCallback, " + ex.Message);            }        }        public void Dispose()        {            try            {                if (socket != null)                {                    if (IsConnected)                    {                        socket.Shutdown(SocketShutdown.Both);                    }                    socket.Close();                    socket.Dispose();                    socket = null;                }            }            catch (Exception ex)            {                System.Diagnostics.Trace.Write("Error in Dispose, " + ex.Message);            }        }    }}
 |