分享
 
 
 

c#中异步基于消息通信的完成端口的TCP/IP协议的组件实现(源代码)

王朝c#·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

源代码:

客户端:

using System;

using System.IO;

using System.ComponentModel;

using System.Collections;

using System.Diagnostics;

using System.Net;

using System.Net.Sockets;

using System.Threading;

namespace MyKJ

{

?///

?/// MyTcpIpClient 提供在Net TCP_IP 协议上基于消息的客户端

?///

?public class MyTcpIpClient : System.ComponentModel.Component

?{

??private int bufferSize=2048;

??private string tcpIpServerIP="127.0.0.1";

??private int tcpIpServerPort=11000;

??private Socket ClientSocket=null;

??private ManualResetEvent connectDone = new ManualResetEvent(false);

??private ManualResetEvent sendDone = new ManualResetEvent(false);

??

??private void ConnectCallback(IAsyncResult ar)

??{

???try

???{

????Socket client = (Socket) ar.AsyncState;

????client.EndConnect(ar);

????

???}

???catch (Exception e)

???{

????OnErrorEvent(new ErrorEventArgs(e));

???}

???finally

???{

????connectDone.Set();

???}

??}

??private void SendCallback(IAsyncResult ar)

??{

???try

???{

????Socket client = (Socket) ar.AsyncState;

????int bytesSent = client.EndSend(ar);

????//Console.WriteLine(bytesSent);

???}

???catch (Exception e)

???{

????OnErrorEvent(new ErrorEventArgs(e));

???}

???finally

???{

????sendDone.Set();

???}

??}

??private void ReceiveCallback(IAsyncResult ar)

??{

???Socket handler=null;

???try

???{

????lock(ar)

????{

?????StateObject state = (StateObject) ar.AsyncState;

?????handler = state.workSocket;

?????

?????int bytesRead = handler.EndReceive(ar);

?????

?????if (bytesRead 0)

?????{

??????int ReadPiont=0;?

??????while(ReadPiont

??????{?

???????if(state.Cortrol==0 && ReadPiont

???????{

????????long bi1=state.buffer[ReadPiont];

????????bi1=(bi1

????????state.packSize=bi1;

????????ReadPiont++;

????????state.Cortrol=1;

???????}

??????

???????if(state.Cortrol==1 && ReadPiont

???????{

????????long bi1=state.buffer[ReadPiont];

????????bi1=(bi1

????????state.packSize=state.packSize+bi1;

????????ReadPiont++;

????????state.Cortrol=2;

???????}

??????

???????if(state.Cortrol==2 && ReadPiont

???????{

????????long bi1=state.buffer[ReadPiont];

????????bi1=(bi1

????????state.packSize=state.packSize+bi1;

????????ReadPiont++;

????????state.Cortrol=3;

???????}

???????

???????if(state.Cortrol==3 && ReadPiont

???????{

????????long bi1=state.buffer[ReadPiont];

????????bi1=bi1&0xff;

????????state.packSize=state.packSize+bi1-4;

????????ReadPiont++;

????????state.Cortrol=4;

???????}

???????

???????if(state.Cortrol==4 && ReadPiont

???????{

????????long bi1=state.buffer[ReadPiont];

????????bi1=(bi1

????????state.residualSize=bi1;

????????ReadPiont++;

????????state.Cortrol=5;

????????state.packSize-=1;

???????}

???????

???????if(state.Cortrol==5 && ReadPiont

???????{

????????long bi1=state.buffer[ReadPiont];

????????bi1=(bi1

????????state.residualSize=state.residualSize+bi1;

????????ReadPiont++;

????????state.Cortrol=6;

????????state.packSize-=1;

???????}

???????

???????if(state.Cortrol==6 && ReadPiont

???????{

????????long bi1=state.buffer[ReadPiont];

????????bi1=(bi1

????????state.residualSize=state.residualSize+bi1;

????????ReadPiont++;

????????state.Cortrol=7;

????????state.packSize-=1;

???????}

???????if(state.Cortrol==7 && ReadPiont

???????{

????????long bi1=state.buffer[ReadPiont];

????????bi1=bi1&0xff;

????????state.residualSize=state.residualSize+bi1;

????????state.Datastream.SetLength(0);

????????state.Datastream.Position=0;

????????

????????ReadPiont++;

????????state.Cortrol=8;

????????state.packSize-=1;

???????}

???????

???????if(state.Cortrol==8 && ReadPiont

???????{

????????int bi1=bytesRead-ReadPiont;

????????int bi2=(int)(state.residualSize-state.Datastream.Length);

????????if(bi1=bi2)

????????{

?????????state.Datastream.Write(state.buffer,ReadPiont,bi2);

?????????ReadPiont+=bi2;

?????????OnInceptEvent(new InceptEventArgs(state.Datastream,handler));

?????????state.Cortrol=9;

?????????state.packSize-=bi2;

?????????}

????????else

????????{

?????????state.Datastream.Write(state.buffer,ReadPiont,bi1);

?????????ReadPiont+=bi1;

?????????state.packSize-=bi1;

????????}

???????}

???????if(state.Cortrol==9 && ReadPiont

???????{

????????int bi1=bytesRead-ReadPiont;

????????if(bi1

????????{

?????????state.packSize=state.packSize-bi1;

?????????ReadPiont+=bi1;

????????}?

????????else

????????{

?????????state.Cortrol=0;

?????????ReadPiont+=(int)state.packSize;

????????}

???????}

??????}

?????}

?????else

?????{

??????throw(new Exception("读入的数据小于1bit"));

?????}

?????if(handler.Connected==true)

?????{

??????handler.BeginReceive(state.buffer,0,bufferSize,0,

???????new AsyncCallback(ReceiveCallback), state);

?????}

????}

???}

???catch (Exception e)

???{

????OnErrorEvent(new ErrorEventArgs(e));

????

???}

??}

??

??///

??/// 连接服务器

??///

??public void Conn()

??{

???try

???{

????ClientSocket=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);?

????IPAddress ipAddress = IPAddress.Parse(tcpIpServerIP);

????IPEndPoint remoteEP = new IPEndPoint(ipAddress, tcpIpServerPort);

????connectDone.Reset();

????ClientSocket.BeginConnect(remoteEP,new AsyncCallback(ConnectCallback),ClientSocket);

????connectDone.WaitOne();

????StateObject state = new StateObject(bufferSize,ClientSocket);

????ClientSocket.BeginReceive(state.buffer,0,bufferSize,0,

?????new AsyncCallback(ReceiveCallback), state);?

???}

???catch(Exception e)

???{

????OnErrorEvent(new ErrorEventArgs(e));

???}

???

??}

??///

??/// 断开连接

??///

??public void Close()

??{

???try

???{

????ClientSocket.Shutdown(SocketShutdown.Both);

????ClientSocket.Close();

???}

???catch(Exception e)

???{

????OnErrorEvent(new ErrorEventArgs(e));

???}

???

??}

??///

??/// 发送一个流数据

??///

??/// 数据流

??public void Send(Stream Astream)

??{

???try

???{

????if(ClientSocket.Connected==false)

????{

?????throw(new Exception("没有连接服务器不可以发送信息!"));

????}

????Astream.Position=0;

????byte[] byteData=new byte[bufferSize];

????int bi1=(int)((Astream.Length+8)/bufferSize);

????int bi2=(int)Astream.Length;

????if(((Astream.Length+8)%bufferSize)0)

????{

?????bi1=bi1+1;

????}

????bi1=bi1*bufferSize;

????

????byteData[0]=System.Convert.ToByte(bi124);

????byteData[1]=System.Convert.ToByte((bi1&0x00ff0000)16);

????byteData[2]=System.Convert.ToByte((bi1&0x0000ff00)8);

????byteData[3]=System.Convert.ToByte((bi1&0x000000ff));

????

????byteData[4]=System.Convert.ToByte(bi224);

????byteData[5]=System.Convert.ToByte((bi2&0x00ff0000)16);

????byteData[6]=System.Convert.ToByte((bi2&0x0000ff00)8);

????byteData[7]=System.Convert.ToByte((bi2&0x000000ff));

????

????int n = Astream.Read(byteData, 8, byteData.Length-8);

????

????while (n0)

????{

?????ClientSocket.BeginSend(byteData, 0, byteData.Length, 0,?new AsyncCallback(SendCallback), ClientSocket);

?????sendDone.WaitOne();

?????byteData=new byte[bufferSize];

?????n = Astream.Read(byteData,0,byteData.Length);

????}

???}

???catch (Exception e)

???{

????OnErrorEvent(new ErrorEventArgs(e));

???}

??}

??

??///

??/// 构造

??///

??/// 父控件

??public MyTcpIpClient(System.ComponentModel.IContainer container)

??{

???container.Add(this);

???InitializeComponent();

???//

???// TODO: 在 InitializeComponent 调用后添加任何构造函数代码

???//

??}

??///

??/// 构造

??///

??public MyTcpIpClient()

??{

???InitializeComponent();

???//

???// TODO: 在 InitializeComponent 调用后添加任何构造函数代码

???//

??}

??#region Component Designer generated code

??///

??/// 设计器支持所需的方法 - 不要使用代码编辑器修改

??/// 此方法的内容。

??///

??private void InitializeComponent()

??{

??}

??#endregion

??///

??/// 要连接的服务器IP地址

??///

??public string TcpIpServerIP

??{

???get

???{

????return tcpIpServerIP;

???}

???set

???{

????tcpIpServerIP=value;

???}

??}

??///

??/// 要连接的服务器所使用的端口

??///

??public int TcpIpServerPort

??{

???get

???{

????return tcpIpServerPort;

???}

???set

???{

????tcpIpServerPort=value;

???}

??}

??///

??/// 缓冲器大小

??///

??public int BufferSize

??{

???get

???{

????return bufferSize;

???}

???set

???{

????bufferSize=value;

???}

??}

??

??///

??/// 连接的活动状态

??///

??public bool Activ

??{

???get

???{

????if(ClientSocket==null)

????{

?????return false;

????}

????return ClientSocket.Connected;

???}

??}

??///

??/// 接收到数据引发的事件

??///

??public event InceptEvent Incept;

??///

??/// 引发接收数据事件

??///

??/// 接收数据

??protected virtual void OnInceptEvent(InceptEventArgs e)

??{

???if (Incept != null)

???{

????Incept(this, e);

???}

??}

??///

??/// 发生错误引发的事件

??///

??public event ErrorEvent Error;

??///

??/// 引发错误事件

??///

??/// 错误数据

??protected virtual void OnErrorEvent(ErrorEventArgs e)

??{

???if (Error != null)

???{

????Error(this, e);

???}

??}

??

?}

?

?///

?/// 接收数据事件

?///

?public class InceptEventArgs : EventArgs

?{?

??private readonly Stream datastream;

??private readonly Socket clientSocket;

??///

??/// 构造

??///

??/// 接收到的数据

??/// 接收的插座

??public InceptEventArgs(Stream Astream,Socket ClientSocket)

??{

???datastream=Astream;

???clientSocket=ClientSocket;

??}

??///

??/// 接受的数据流

??///

??public Stream Astream

??{????

???get { return datastream;}?????

??}

??///

??/// 接收的插座

??///

??public Socket ClientSocket

??{????

???get { return clientSocket;}?????

??}

?}?

?///

?/// 定义接收委托

?///

?public delegate void InceptEvent(object sender, InceptEventArgs e);

?///

?/// 错处事件

?///

?public class ErrorEventArgs : EventArgs

?{?

??private readonly Exception error;

??///

??/// 构造

??///

??/// 错误信息对象

??public ErrorEventArgs(Exception Error)

??{

???error=Error;

??}

??///

??/// 错误信息对象

??///

??public Exception Error

??{????

???get { return error;}?????

??}

?}

?///

?/// 错误委托

?///

?public delegate void ErrorEvent(object sender, ErrorEventArgs e);

?

?

?

}

服务器端:

using System;

using System.IO;

using System.ComponentModel;

using System.Collections;

using System.Diagnostics;

using System.Net;

using System.Net.Sockets;

using System.Threading;

namespace MyKJ

{

?///

?/// MyTcpIpClient 提供在Net TCP_IP 协议上基于消息的服务端

?///

?public class MyTcpIpServer : System.ComponentModel.Component

?{

??private int bufferSize=2048;

??private string tcpIpServerIP="";

??private int tcpIpServerPort=11000;

??private Socket listener=null;

??private ManualResetEvent allDone = new ManualResetEvent(false);

??private ManualResetEvent sendDone = new ManualResetEvent(false);

??private Thread thread=null;

??

??private void StartListening()

??{

???try

???{

????listener = new Socket(AddressFamily.InterNetwork,

?????SocketType.Stream, ProtocolType.Tcp);

?????

????IPAddress ipAddress;

????if(tcpIpServerIP.Trim()=="")

????{

?????ipAddress=IPAddress.Any;?

????}

????else

????{

?????ipAddress=IPAddress.Parse(tcpIpServerIP);

????}

????IPEndPoint localEndPoint = new IPEndPoint(ipAddress, tcpIpServerPort);

????

????listener.Bind(localEndPoint);

????listener.Listen(10);

????while (true)

????{

?????allDone.Reset();

?????listener.BeginAccept(new AsyncCallback(AcceptCallback),listener);

?????allDone.WaitOne();

????}

???}

???catch (Exception e)

???{

????OnErrorServerEvent(new ErrorServerEventArgs(e,listener));?

???}

??}

??

??private void ReadCallback(IAsyncResult ar)

??{

???Socket handler=null;

???try

???{

????lock(ar)

????{

?????StateObject state = (StateObject) ar.AsyncState;

?????handler = state.workSocket;

?????

?????int bytesRead = handler.EndReceive(ar);

?????

?????if (bytesRead 0)

?????{

??????int ReadPiont=0;?

??????while(ReadPiont

??????{?

???????if(state.Cortrol==0 && ReadPiont

???????{

????????long bi1=state.buffer[ReadPiont];

????????bi1=(bi1

????????state.packSize=bi1;

????????ReadPiont++;

????????state.Cortrol=1;

???????}

??????

???????if(state.Cortrol==1 && ReadPiont

???????{

????????long bi1=state.buffer[ReadPiont];

????????bi1=(bi1

????????state.packSize=state.packSize+bi1;

????????ReadPiont++;

????????state.Cortrol=2;

???????}

??????

???????if(state.Cortrol==2 && ReadPiont

???????{

????????long bi1=state.buffer[ReadPiont];

????????bi1=(bi1

????????state.packSize=state.packSize+bi1;

????????ReadPiont++;

????????state.Cortrol=3;

???????}

???????

???????if(state.Cortrol==3 && ReadPiont

???????{

????????long bi1=state.buffer[ReadPiont];

????????bi1=bi1&0xff;

????????state.packSize=state.packSize+bi1-4;

????????ReadPiont++;

????????state.Cortrol=4;

???????}

???????

???????if(state.Cortrol==4 && ReadPiont

???????{

????????long bi1=state.buffer[ReadPiont];

????????bi1=(bi1

????????state.residualSize=bi1;

????????ReadPiont++;

????????state.Cortrol=5;

????????state.packSize-=1;

???????}

???????

???????if(state.Cortrol==5 && ReadPiont

???????{

????????long bi1=state.buffer[ReadPiont];

????????bi1=(bi1

????????state.residualSize=state.residualSize+bi1;

????????ReadPiont++;

????????state.Cortrol=6;

????????state.packSize-=1;

???????}

???????

???????if(state.Cortrol==6 && ReadPiont

???????{

????????long bi1=state.buffer[ReadPiont];

????????bi1=(bi1

????????state.residualSize=state.residualSize+bi1;

????????ReadPiont++;

????????state.Cortrol=7;

????????state.packSize-=1;

???????}

???????if(state.Cortrol==7 && ReadPiont

???????{

????????long bi1=state.buffer[ReadPiont];

????????bi1=bi1&0xff;

????????state.residualSize=state.residualSize+bi1;

????????state.Datastream.SetLength(0);

????????state.Datastream.Position=0;

????????

????????ReadPiont++;

????????state.Cortrol=8;

????????state.packSize-=1;

???????}

???????

???????if(state.Cortrol==8 && ReadPiont

???????{

????????int bi1=bytesRead-ReadPiont;

????????int bi2=(int)(state.residualSize-state.Datastream.Length);

????????if(bi1=bi2)

????????{

?????????state.Datastream.Write(state.buffer,ReadPiont,bi2);

?????????ReadPiont+=bi2;

?????????OnInceptServerEvent(new InceptServerEventArgs(state.Datastream,state.workSocket,this));

?????????state.Cortrol=9;

?????????state.packSize-=bi2;

?????????

?????????

????????}

????????else

????????{

?????????state.Datastream.Write(state.buffer,ReadPiont,bi1);

?????????ReadPiont+=bi1;

?????????state.packSize-=bi1;

????????}

???????}

???????if(state.Cortrol==9 && ReadPiont

???????{

????????int bi1=bytesRead-ReadPiont;

????????if(bi1

????????{

?????????state.packSize=state.packSize-bi1;

?????????ReadPiont+=bi1;

????????}?

????????else

????????{

?????????state.Cortrol=0;

?????????ReadPiont+=(int)state.packSize;

????????}

???????}

??????}

??????if(handler.Connected==true)

??????{

???????handler.BeginReceive(state.buffer,0,bufferSize,0,

????????new AsyncCallback(ReadCallback), state);

??????}

?????}

?????else

?????{

??????handler.Shutdown(SocketShutdown.Both);

??????handler.Close();

??????//throw(new Exception("读入的数据小于1bit"));

?????}

????}

???}

???catch (Exception e)

???{

????OnErrorServerEvent(new ErrorServerEventArgs(e,handler));

????

???}

??}

??

??private void SendCallback(IAsyncResult ar)

??{

???Socket client = (Socket) ar.AsyncState;

???try

???{

????int bytesSent = client.EndSend(ar);

???}

???catch (Exception e)

???{

????OnErrorServerEvent(new ErrorServerEventArgs(e,client));

???}

???finally

???{

????sendDone.Set();

???}

??}

??

??private void AcceptCallback(IAsyncResult ar)

??{

???Socket handler=null;

???try

???{

????Socket listener = (Socket) ar.AsyncState;

????handler= listener.EndAccept(ar);

????StateObject state = new StateObject(bufferSize,handler);

????state.workSocket = handler;

????handler.BeginReceive(state.buffer,0,bufferSize,0,

?????new AsyncCallback(ReadCallback), state);

???}

???catch (Exception e)

???{

????OnErrorServerEvent(new ErrorServerEventArgs(e,handler));

???}

???finally

???{

????allDone.Set();

???}

??}

??

??///

??/// 析构

??///

??/// 不知道

??protected override void Dispose(bool disposing)

??{

???Abort();

??}

??

??///

??/// 引发接收事件

??///

??/// 数据

??protected virtual void OnInceptServerEvent(InceptServerEventArgs e)

??{

???if (InceptServer != null)

???{

????InceptServer(this, e);

???}

??}

??///

??/// 引发错误事件

??///

??/// 数据

??protected virtual void OnErrorServerEvent(ErrorServerEventArgs e)

??{

???if (ErrorServer != null)

???{

????ErrorServer(this, e);

???}

??}

??

??///

??/// 开始监听访问

??///

??public void Listening()

??{

???//StartListening();

???thread=new Thread(new ThreadStart(StartListening));

???thread.Name="MyTcpIpServer.Listening";

???thread.Start();

??}

??///

??/// 异常中止服务

??///

??public void Abort()

??{

???if(thread!=null)

???{

????thread.Abort();

????listener.Close();

???}

??}

??

??///

??///构造

??///

??/// 父控件

??public MyTcpIpServer(System.ComponentModel.IContainer container)

??{

???container.Add(this);

???InitializeComponent();

???//

???// TODO: 在 InitializeComponent 调用后添加任何构造函数代码

???//

??}

??///

??/// 构造

??///

??public MyTcpIpServer()

??{

???InitializeComponent();

???//

???// TODO: 在 InitializeComponent 调用后添加任何构造函数代码

???//

??}

??#region Component Designer generated code

??///

??/// 设计器支持所需的方法 - 不要使用代码编辑器修改

??/// 此方法的内容。

??///

??private void InitializeComponent()

??{

??}

??#endregion

??///

??/// 要连接的服务器IP地址

??///

??public string TcpIpServerIP

??{

???get

???{

????return tcpIpServerIP;

???}

???set

???{

????tcpIpServerIP=value;

???}

??}

??///

??/// 要连接的服务器所使用的端口

??///

??public int TcpIpServerPort

??{

???get

???{

????return tcpIpServerPort;

???}

???set

???{

????tcpIpServerPort=value;

???}

??}

??///

??/// 缓冲器大小

??///

??public int BufferSize

??{

???get

???{

????return bufferSize;

???}

???set

???{

????bufferSize=value;

???}

??}

??

??///

??/// 连接的活动状态

??///

??public bool Activ

??{

???get

???{

????return listener.Connected;

???}

???//set

???//{

???//?activ=value;

???//}

??}

??///

??/// 发送一个流数据

??///

??public void Send(Socket ClientSocket,Stream Astream)

??{

???try

???{

????if(ClientSocket.Connected==false)

????{

?????throw(new Exception("没有连接客户端不可以发送信息!"));

????}

????Astream.Position=0;

????byte[] byteData=new byte[bufferSize];

????int bi1=(int)((Astream.Length+8)/bufferSize);

????int bi2=(int)Astream.Length;

????if(((Astream.Length+8)%bufferSize)0)

????{

?????bi1=bi1+1;

????}

????bi1=bi1*bufferSize;

????

????byteData[0]=System.Convert.ToByte(bi124);

????byteData[1]=System.Convert.ToByte((bi1&0x00ff0000)16);

????byteData[2]=System.Convert.ToByte((bi1&0x0000ff00)8);

????byteData[3]=System.Convert.ToByte((bi1&0x000000ff));

????

????byteData[4]=System.Convert.ToByte(bi224);

????byteData[5]=System.Convert.ToByte((bi2&0x00ff0000)16);

????byteData[6]=System.Convert.ToByte((bi2&0x0000ff00)8);

????byteData[7]=System.Convert.ToByte((bi2&0x000000ff));

????

????int n = Astream.Read(byteData, 8, byteData.Length-8);

????

????while (n0)

????{

?????ClientSocket.BeginSend(byteData, 0, byteData.Length, 0,?new AsyncCallback(SendCallback), ClientSocket);

?????sendDone.WaitOne();

?????byteData=new byte[bufferSize];

?????n = Astream.Read(byteData,0,byteData.Length);

????}

???}

???catch (Exception e)

???{

????OnErrorServerEvent(new ErrorServerEventArgs(e,ClientSocket));

???}

??}

??

??///

??/// 接收到数据事件

??///

??public event InceptServerEvent InceptServer;

??///

??/// 发生错误事件

??///

??public event ErrorServerEvent ErrorServer;

?}

?///

?/// 状态对象

?///

?public class StateObject

?{

??///

??/// 构造

??///

??/// 缓存

??/// 工作的插座

??public StateObject(int bufferSize,Socket WorkSocket)

??{

???buffer = new byte[bufferSize];

???workSocket=WorkSocket;

??}

??///

??/// 缓存

??///

??public byte[] buffer = null;

??///

??/// 工作插座

??///

??public Socket workSocket = null;?????????????

??///

??/// 数据流

??///

??public Stream Datastream=new MemoryStream();

??///

??/// 剩余大小

??///

??public long residualSize=0;

??///

??/// 数据包大小

??///

??public long packSize=0;

??///

??/// 计数器

??///

??public int Cortrol=0;

?}

?

?///

?/// 接收事件

?///

?public class InceptServerEventArgs : EventArgs

?{?

??private readonly Stream datastream;

??private readonly Socket serverSocket;

??private readonly MyTcpIpServer tcpIpServer;

??///

??/// 构造

??///

??/// 数据

??/// 工作插座

??/// 提供服务的TCP/IP对象

??public InceptServerEventArgs(Stream Astream,Socket ServerSocket,MyTcpIpServer TcpIpServer)

??{

???datastream=Astream;

???serverSocket=ServerSocket;

???tcpIpServer=TcpIpServer;

??}

??? ///

??? /// 数据

??? ///

??public Stream Astream

??{????

???get { return datastream;}?????

??}

??///

??/// 工作插座

??///

??public Socket ServerSocket

??{????

???get { return serverSocket;}?????

??}

??///

??/// 提供TCP/IP服务的服务器对象.

??///

??public MyTcpIpServer TcpIpServer

??{????

???get { return tcpIpServer;}?????

??}

?}

?///

?/// 接收数据委托

?///

? public delegate void InceptServerEvent(object sender, InceptServerEventArgs e);

?///

?/// 错误事件委托

?///

?public class ErrorServerEventArgs : EventArgs

?{?

??private readonly Exception error;

??private readonly Socket serverSocket;

??///

??/// 构造

??///

??/// 数据

??/// 问题插座

??public ErrorServerEventArgs(Exception Error,Socket ServerSocket)

??{

???error=Error;

???serverSocket=ServerSocket;

??}

??? ///

??? /// 数据

??? ///

??public Exception Error

??{????

???get { return error;}?????

??}

??///

??/// 问题插座

??///

??public Socket ServerSocket

??{????

???get { return serverSocket;}?????

??}

?}

?///

?///错误事件委托

?///

? public delegate void ErrorServerEvent(object sender, ErrorServerEventArgs e);

}

完成端口方式是NT目前最好的一种通信方式,它在大吞吐,大数量连接下,比其它方式有无法比拟的效率以及性能,因C#在的Socket在内部使用的完成端口方式,在程序实现上异常简单,请大家体会.

?

?

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有