0

Synchronous Server アプリケーションで ReadKey() を使用して Socket.Accept() を中断する方法を知りたいです。たとえば、Esc または Ctr+X キーを押すと、Socket が自動的に停止します。いくつかの読書に基づいて、Accept() メソッドを呼び出した後、接続が受信されるまでアプリケーションが中断されることがわかっています。cmiw

ここに私のコードの一部..

      Socket listener = new Socket(AddressFamily.InterNetwork,
        SocketType.Stream, ProtocolType.Tcp);

    try
    {
        listener.Bind(localEndPoint);
        listener.Listen(10);

        while (true)
        {
            Console.WriteLine("\t [wating connection from client...]");

            //Based on msd doc, application will be suspend after this method
            Socket handler = listener.Accept();
            data = null;

            //i wanna catch an Escape key here
            ConsoleKeyInfo keyx = Console.ReadKey(true);
            while (keyx.Key != ConsoleKey.Escape)
            {
                // Koneksi masuk yang di proses
                while (true)
                {
                    bytes = new byte[1024];
                    int bytesRec = handler.Receive(bytes);
                    data += Encoding.ASCII.GetString(bytes, 0, bytesRec);
                    if (data.IndexOf("<EOF>") > -1)
                    {
                        break;
                    }
                }


                Console.WriteLine("Message Received : {0}", data);
                Console.WriteLine(handler.RemoteEndPoint.ToString());
                // Memberikan balasan pada client
                Console.Write("Your Reply  : ");
                String pesan = Console.ReadLine();
                byte[] msg = Encoding.ASCII.GetBytes(pesan + "<EOF>");

                handler.Send(msg);
            }

            handler.Shutdown(SocketShutdown.Both);
            handler.Close();
        }

    }
    catch (Exception e)
    {
        Console.WriteLine(e.ToString());
    }
4

2 に答える 2

1

実際には次の 2 つのパスをたどることができると思います。

  1. このコードを Socket.BeginAccept/Socket.EndAccept を使用するように変更します (EndAccept メソッドで BeginAccept を再度呼び出して複数のクライアントを処理します)。次に、プログラムのシャットダウン要件が満たされたときに、while ループで Socket.Shutdown を呼び出すだけです。
  2. BeginAccept/EndAccept を利用したくない場合 (理由は想像できませんが)、メイン スレッドが適切なキーの組み合わせを待機している間に Socket.Accept を実行する別のスレッドを生成し、もう一度呼び出すことができます。 Socket.Shutdown メソッド。
于 2013-05-17T06:55:12.560 に答える
0

Socket.poll コマンドを使用することもできます。poll が true を返した場合、accept_able の場合、ソケットはそれ以外の場合は入力キーをチェックし、Esc の場合は終了します。

例:

do
{
    // Poll use microseconds, waits 1 second
    if (listener.Poll(1000000, SelectMode.SelectRead)) 
    {
       // the socket is accept/able
       Socket handler = listener.Accept();
       etc ...
    }

    //i wanna catch an Escape key here
    ConsoleKeyInfo keyx = Console.ReadKey(true);
    while (keyx.Key != ConsoleKey.Escape) 
    etc ...

} while (true);
于 2013-05-17T10:37:42.947 に答える