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
由于我从未使用过它,因此我正在尝试了解此异步操作中的内容。
第1步。创建它
SocketSrv
是为了接受 TCP 连接,发送和接收“命令”的类型是流。第2步。套接字与 ip,port 绑定,然后我们开始监听连接。
第三步。在 while 循环中:
ManualResetEvent
是重置(我知道这是ManualResetEvent
一个类型为布尔值的类,并指示线程何时忙)。在这种情况下,事件总是被重置,因为如果建立了连接并且另一个连接即将到来,我需要重置它并再次开始“操作”。在
BeingAccept
我正在启动异步操作中,执行的回调函数和IAsyncResult
将成为“套接字”的参数。
第4步。is now Waiting 阻塞当前
ResetEvent
线程并等待连接方法中的处理程序结束,以便它可以完成初始化当前连接。第五步。在连接线程中,
ResetEvent
将信号设置为 true,这意味着......好吧,我不知道这意味着什么。我认为它告诉ResetEvent
解除阻塞主线程。
在“con”套接字中,我得到了AsyncState
. 我不知道这意味着什么。
在处理程序套接字中,我告诉ResetEvent
连接已建立。
说了这么多,有人能告诉我我说的是真的还是错的,为什么?