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 にバインドされ、接続のリッスンを開始します。
Step3. while ループ内:
はリセットです(これはブール型で、スレッドがビジーかどうかを示すクラスである
ManualResetEvent
ことを理解していManualResetEvent
ます)。この場合、接続が確立され、別の接続が来ている場合、リセットする必要があるため、イベントは常にリセットされます再度「操作」を開始してください。非同期動作を開始し
BeingAccept
ている中で、実行されるコールバック関数とIAsyncResult
「ソケット」となる引数。
Step4.
ResetEvent
現在、Waiting は現在のスレッドをブロックし、接続メソッドのハンドラーが終了するのを待っているため、現在の接続の初期化を完了できます。Step5. 接続スレッドで
ResetEvent
は、シグナルを true に設定します。つまり、それが何を意味するのかわかりません。ResetEvent
メインスレッドのブロックを解除するように指示していると思います。
「con」ソケットでは、AsyncState
. 私はそれが何を意味するのか分かりません。
ハンドラー ソケットResetEvent
で、接続が確立されたことを伝えます。
言われていることですが、誰かが私が言ったことが真実か間違っているか、そしてその理由を教えてもらえますか?