using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Net.Sockets; using System.Threading; using System.Net; using CommonLib; using System.Net.NetworkInformation; namespace FINSTCPIP { public class TcpSocket { public static readonly Dictionary thisLock = new Dictionary(); public static event CWriteDarkCasketEventHandler WriteDarkCasket; public static void OnWriteDarkCasket(CWriteDarkCasketEventArgs e) { if (WriteDarkCasket != null) { WriteDarkCasket(null, e); } } protected Socket m_Socket; private int m_Devindex; private string m_IP; private int m_Port; protected bool m_IsServer; protected int m_BackLog; protected byte[] m_Buffer = new byte[1024 * 256]; protected byte[] m_Buffer2 = new byte[1024 * 256]; private bool m_Close; #region 构造函数 public TcpSocket(string ip, int port, int devindex = 0, bool isServer = false, int backlog = 10) { this.m_IP = ip; this.m_Port = port; this.m_IsServer = isServer; this.m_BackLog = backlog; this.m_Devindex = devindex; } #endregion #region 事件 public event SocketOpenSuccessEventHandler OpenSuccess { add { onOpenSuccess += value; } remove { onOpenSuccess -= value; } } protected SocketOpenSuccessEventHandler onOpenSuccess; public event SocketOpenFailEventHandler OpenFail { add { onOpenFail += value; } remove { onOpenFail -= value; } } protected SocketOpenFailEventHandler onOpenFail; public event SocketAcceptSuccessEventHandler AcceptSuccess { add { onAcceptSuccess += value; } remove { onAcceptSuccess -= value; } } protected SocketAcceptSuccessEventHandler onAcceptSuccess; public event SocketAccpetFaileEventHandler AcceptFail { add { onAcceptFail += value; } remove { onAcceptFail -= value; } } protected SocketAccpetFaileEventHandler onAcceptFail; public event SocketCloseSuccessEventHandler CloseSuccess { add { onCloseSuccess += value; } remove { onCloseSuccess -= value; } } protected SocketCloseSuccessEventHandler onCloseSuccess; public event SocketCloseFailEventHandler CloseFail { add { onCloseFail += value; } remove { onCloseFail -= value; } } protected SocketCloseFailEventHandler onCloseFail; public event SocketSendSuccessEventHandler SendSuccess { add { onSendSuccess += value; } remove { onSendSuccess -= value; } } protected SocketSendSuccessEventHandler onSendSuccess; public event SocketSendFailEventHandler SendFail { add { onSendFail += value; } remove { onSendFail -= value; } } protected SocketSendFailEventHandler onSendFail; public event SocketReceiveSuccessEventHandler ReceiveSuccess { add { onReceiveSuccess += value; } remove { onReceiveSuccess -= value; } } protected SocketReceiveSuccessEventHandler onReceiveSuccess; public event SocketReceiveFailEventHandler ReceiveFail { add { onReceiveFail += value; } remove { onReceiveFail -= value; } } protected SocketReceiveFailEventHandler onReceiveFail; public event SocketDisconnectEventHandler Disconnect { add { onDisconnect += value; } remove { onDisconnect -= value; } } protected SocketDisconnectEventHandler onDisconnect; public string IP { get => m_IP; set => m_IP = value; } public int Port { get => m_Port; set => m_Port = value; } #endregion #region 方法 public void Open() { if(m_Socket != null) { m_Socket.Dispose(); } m_Close = false; string localip = ""; int localport = 0; IPEndPoint endPoint = new IPEndPoint(string.IsNullOrEmpty(m_IP) ? IPAddress.Any : Dns.GetHostAddresses(m_IP)[0], m_Port); IPEndPoint localPoint = new IPEndPoint(Dns.GetHostAddresses(localip)[0], localport); m_Socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); try { if(m_IsServer) { m_Socket.Bind(localPoint); m_Socket.Listen(m_BackLog); m_Socket.BeginAccept(new AsyncCallback(AcceptCallBack), null); //建立socket等待客户端链接 } else { //m_Socket.Bind(localPoint); m_Socket.Connect(endPoint); } if(onOpenSuccess != null) { foreach(SocketOpenSuccessEventHandler item in onOpenSuccess.GetInvocationList()) { item.BeginInvoke(null, null); } } } catch (Exception ex) { if(onOpenFail != null) { foreach(SocketOpenFailEventHandler item in onOpenFail.GetInvocationList()) { item.BeginInvoke(ex, null, null); } } } } protected virtual void AcceptCallBack(IAsyncResult ar) { try { Socket socket = this.m_Socket.EndAccept(ar); if(onAcceptSuccess != null) { foreach(SocketAcceptSuccessEventHandler item in onAcceptSuccess.GetInvocationList()) { item.BeginInvoke(socket, null, null); } m_Socket.BeginAccept(new AsyncCallback(AcceptCallBack), null); } } catch (Exception ex) { if(onAcceptFail != null) { foreach(SocketAccpetFaileEventHandler item in onAcceptFail.GetInvocationList()) { item.BeginInvoke(ex, null, null); } } } } public void Close() { if (m_Close == false) { m_Close = true; } else { return; } try { if (m_Socket.Connected == true) { m_Socket.Shutdown(SocketShutdown.Both); if (m_IsServer) { Thread.Sleep(200); m_Socket.Dispose(); m_Socket = null; } else { m_Socket.BeginDisconnect(false, CloseCallBack, m_Socket); } } else { m_Socket = null; } } catch (Exception ex) { if(onCloseFail != null) { foreach(SocketCloseFailEventHandler item in onCloseFail.GetInvocationList()) { item.BeginInvoke(ex, null, null); } } } } protected virtual void CloseCallBack(IAsyncResult ar) { try { Socket socket = ar.AsyncState as Socket; socket.EndDisconnect(ar); socket.Dispose(); //socket = null; if (onCloseSuccess != null) { foreach(SocketCloseSuccessEventHandler item in onCloseSuccess.GetInvocationList()) { item.BeginInvoke(null, null); } } } catch (Exception ex) { if(onCloseFail != null) { foreach(SocketCloseFailEventHandler item in onCloseFail.GetInvocationList()) { item.BeginInvoke(ex, null, null); } } } } public void Send(byte[] buffer, Socket socket = null) { //lock (thisLock1) { if (socket == null) { socket = this.m_Socket; } try { socket.BeginSend(buffer, 0, buffer.Length, 0, new AsyncCallback(SendCallBack), socket); } catch (Exception ex) { //m_Close = false; if (onSendFail != null) { foreach (SocketSendFailEventHandler item in onSendFail.GetInvocationList()) { item.BeginInvoke(ex, null, null); } } if (onDisconnect != null && !m_Close) { foreach (SocketDisconnectEventHandler item in onDisconnect.GetInvocationList()) { item.BeginInvoke(ex, null, null); } } } } } protected virtual void SendCallBack(IAsyncResult ar) { try { Socket socket = ar.AsyncState as Socket; socket.EndSend(ar); if(onSendSuccess != null) { foreach(SocketSendSuccessEventHandler item in onSendSuccess.GetInvocationList()) { item.BeginInvoke(null, null); } } } catch (Exception ex) { if(onSendFail != null) { foreach(SocketSendFailEventHandler item in onSendFail.GetInvocationList()) { item.BeginInvoke(ex, null, null); } } if (onDisconnect != null && !m_Close) { foreach (SocketDisconnectEventHandler item in onDisconnect.GetInvocationList()) { item.BeginInvoke(ex, null, null); } } } } public void Receive(Socket socket = null) { //lock (thisLock1) { if (socket == null) { socket = this.m_Socket; } try { socket.BeginReceive(m_Buffer, 0, m_Buffer.Length, 0, new AsyncCallback(ReceiveCallBack), socket); } catch (Exception ex) { if (onReceiveFail != null) { foreach (SocketReceiveFailEventHandler item in onReceiveFail.GetInvocationList()) { item.BeginInvoke(ex, null, null); } } } } } protected virtual void ReceiveCallBack(IAsyncResult ar) { try { Socket socket = ar.AsyncState as Socket; int length = socket.EndReceive(ar); if (length > 0) { byte[] data = new byte[length]; //if (m_IP == "192.168.0.232") { lock (TcpSocket.thisLock[m_IP]) { Array.Copy(m_Buffer, data, length); } } int[] tem = new int[1]; if (onReceiveSuccess != null) { foreach (SocketReceiveSuccessEventHandler item in onReceiveSuccess.GetInvocationList()) { item.BeginInvoke(data, null, null); } } socket.BeginReceive(m_Buffer, 0, m_Buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallBack), socket); } else { //if (onDisconnect != null && !m_Close) //{ // foreach (SocketDisconnectEventHandler item in onDisconnect.GetInvocationList()) // { // item.BeginInvoke(new Exception(), null, null); // } //} } } catch (Exception ex) { if(onReceiveFail != null) { foreach(SocketReceiveFailEventHandler item in onReceiveFail.GetInvocationList()) { item.BeginInvoke(ex, null, null); } } if(onDisconnect != null && !m_Close) { foreach(SocketDisconnectEventHandler item in onDisconnect.GetInvocationList()) { item.BeginInvoke(ex, null, null); } } } } #endregion public delegate void SocketOpenSuccessEventHandler(); public delegate void SocketOpenFailEventHandler(Exception ex); public delegate void SocketAcceptSuccessEventHandler(Socket socket); public delegate void SocketAccpetFaileEventHandler(Exception ex); public delegate void SocketCloseSuccessEventHandler(); public delegate void SocketCloseFailEventHandler(Exception ex); public delegate void SocketSendSuccessEventHandler(); public delegate void SocketSendFailEventHandler(Exception ex); public delegate void SocketReceiveSuccessEventHandler(byte[] receiveData); public delegate void SocketReceiveFailEventHandler(Exception ex); public delegate void SocketDisconnectEventHandler(Exception ex); } }