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