Socket SocketSrv;
public static ManualResetEvent Done = new ManualResetEvent(false);
IPEndPoint IPP = new IPEndPoint(IPAddress.Any, 1234);
void Listening()
{
SocketSrv = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
try
{
SocketSrv.Bind(IPP);
SocketSrv.Listen(5);
while (true)
{
Done.Reset();
info.Text = "Waiting for connections....";
SocketSrv.BeginAccept(new AsyncCallback(Connection),
SocketSrv);
Done.WaitOne();
}
}
catch(Exception error)
{
MessageBox.Show(error.Message);
}
}
void Connection(IAsyncResult ar)
{
Done.Set();
Socket con= (Socket)ar.AsyncState;
Socket handler = con.EndAccept(ar);
}
我想了解在此异步操作中的ManualResetEvent
,因为我从来没有使用它。了解异步服务器套接字中的ManualResetEvent
Step1。
SocketSrv
被创建为接受TCP连接,并且发送和接收“命令”的类型是流。Step2。套接字与ip,port绑定,然后我们开始监听连接。
Step3。在while循环:
的
ManualResetEvent
复位(据我所知,ManualResetEvent
是一类为布尔类型,并指出当线程正忙或没有)。在这种情况下,事件总是被复位,因为如果有连接并且另一个连接正在进行,我需要重置它并再次启动“操作”。在
BeingAccept
我正在启动异步操作,执行的回调函数和IAsyncResult
参数将成为“套接字”。
Step4。
ResetEvent
现在正在等待阻止当前线程并等待连接方法中的处理程序结束,以便它可以完成初始化当前连接。Step5。在连接线程中,
ResetEvent
将信号设置为真,这意味着...以及我不知道它是什么意思。我认为它告诉ResetEvent
解锁主线程。
在'con'插座中,我得到了AsyncState
。我不知道这是什么意思。
在处理程序套接字中,我告诉ResetEvent
已建立连接。
有人说,有人可以告诉我,如果我说的是真/错,为什么?
这是毫无意义的。只需使用非异步版本SocketSrv.Accept()即可在没有事件的情况下获得完全相同的结果。 –
不是真的..因为我会继续添加读取,使用异步操作进行写入,以便在执行其他操作时可以接受多个连接。 – Leo
在Done.WaitOne()调用中阻止代码时,没有任何内容处于“继续”状态。也许你打算使这个异步,它只是不是在它的当前版本。 –