1 using System;
2 using System.Collections.Generic;
3 using System.Text;
4 using System.Net.Sockets;
5 using System.Net;
6
7 namespace SICOMSocket
8 {
9 public class SocketAsyncServer
10 {
11
12 public delegate void ProcessMessageeDelegate(Socket clientSock, byte[] msgBuff, DateTime getDataTime);
13 public event ProcessMessageeDelegate ProcessMessageeEnvent;
14
15 public delegate void ClearFlag();
16 public event ClearFlag Clear;
17
18 public delegate void NewConnectDelegate(string IP, string port, Socket clinetSocket);
19 public event NewConnectDelegate NewConnectEnvent;
20
21 public delegate void ClientShutDownDelegate(string IP, string port);
22 public event ClientShutDownDelegate ClientShutDownEnvent;
23
24
25 private Socket serverSock;
26 byte[] msgBuff = new byte[1024];
27
28 public void Start(int port)
29 {
30 try
31 {
32 serverSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
33 serverSock.Bind(new IPEndPoint(IPAddress.Any, port));
34 serverSock.Listen(10);
35 Console.WriteLine("开始监听端口" + port + "......");
36 serverSock.BeginAccept(new AsyncCallback(OnConnectRequest), serverSock);
37 }
38 catch (Exception ex)
39 {
40 Console.WriteLine("监听端口" + port + "失败,请检查该端口是否被占用! " + ex.Message);
41 }
42 }
43
44 public void OnConnectRequest(IAsyncResult ar)
45 {
46 try
47 {
48 Socket listenerSock = (Socket)ar.AsyncState;
49 NewConnection(listenerSock.EndAccept(ar));
50 listenerSock.BeginAccept(new AsyncCallback(OnConnectRequest), listenerSock);
51 Console.WriteLine("已接受远程连接!");
52 }
53 catch (Exception ex)
54 {
55 Console.WriteLine("新链接创建错误:" + ex.Message);
56 }
57 }
58
59 private void NewConnection(Socket clientSock)
60 {
61 try
62 {
63 EndPoint tempRemoteEP = clientSock.RemoteEndPoint;
64 IPEndPoint tempRemoteIP = (IPEndPoint)tempRemoteEP;
65 string rempip = tempRemoteIP.Address.ToString();
66 string remoport = tempRemoteIP.Port.ToString();
67 NewConnectEnvent(rempip, remoport, clientSock);
68 Clear();
69 AsyncCallback recieveData = new AsyncCallback(OnRecievedData);
70 clientSock.BeginReceive(msgBuff, 0, msgBuff.Length, SocketFlags.None, recieveData, clientSock);
71 }
72 catch (Exception ex)
73 {
74 Console.WriteLine("接收回调函数设置失败 {0}", ex.Message);
75 }
76 }
77
78 public void OnRecievedData(IAsyncResult ar)
79 {
80 Socket sock = (Socket)ar.AsyncState;
81 try
82 {
83 DateTime getDataTime = DateTime.Now;
84 int nBytesRec = sock.EndReceive(ar);
85 if (nBytesRec > 0)
86 {
87 byte[] recievedNowBuff = new byte[nBytesRec];
88 Array.Copy(msgBuff, recievedNowBuff, nBytesRec);
89 try
90 {
91 AsyncCallback recieveData = new AsyncCallback(OnRecievedData);
92 sock.BeginReceive(msgBuff, 0, msgBuff.Length, SocketFlags.None, recieveData, sock);
93 }
94 catch (Exception ex)
95 {
96 Console.WriteLine("接收回调函数设置失败 {0}", ex.Message);
97 }
98
99 System.Threading.Thread t1 = new System.Threading.Thread(delegate() { ProcessMessageeEnvent(sock, recievedNowBuff, getDataTime); });
100 t1.Start();
101 }
102 else
103 {
104 Console.WriteLine("连接中断 {0}", sock.RemoteEndPoint);
105 EndPoint tempRemoteEP = sock.RemoteEndPoint;
106 IPEndPoint tempRemoteIP = (IPEndPoint)tempRemoteEP;
107 string rempip = tempRemoteIP.Address.ToString();
108 string remoport = tempRemoteIP.Port.ToString();
109 sock.Shutdown(SocketShutdown.Both);
110 sock.Close();
111 ClientShutDownEnvent(rempip, remoport);
112 }
113 }
114 catch (Exception ex)
115 {
116 Console.WriteLine(ex.Message, "未知错误!");
117 }
118 }
119 }
120
121 }
SICOMSocket.SocketAsyncServer SAC = new SICOMSocket.SocketAsyncServer();
byte ServerID;
public void Start(byte ServerID)
{
this.ServerID = ServerID;
SAC.ClientShutDownEnvent += new SICOMSocket.SocketAsyncServer.ClientShutDownDelegate(SAC_ClientShutDownEnvent);
SAC.NewConnectEnvent += new SICOMSocket.SocketAsyncServer.NewConnectDelegate(SAC_NewConnectEnvent);
SAC.ProcessMessageeEnvent += new SICOMSocket.SocketAsyncServer.ProcessMessageeDelegate(SAC_ProcessMessageeEnvent);
SAC.Start(502);
}
void SAC_NewConnectEnvent(string IP, string port, System.Net.Sockets.Socket clinetSocket)
{
Console.WriteLine(DateTime.Now.ToString() + "监听到一个新的连接:对方IP[" + IP + "]" + "对方端口[" + port + "]");
}
void SAC_ClientShutDownEnvent(string IP, string port)
{
Console.WriteLine(DateTime.Now.ToString() + "连接中断:对方IP[" + IP + "]" + "对方端口[" + port + "]");
}