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()調用中阻止代碼時,沒有任何內容處於「繼續」狀態。也許你打算使這個異步,它只是不是在它的當前版本。 –