0

我想知道如何使用 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

我认为您实际上可以遵循两条路径:

  1. 更改此代码以使用 Socket.BeginAccept/Socket.EndAccept(使用 EndAccept 方法再次调用 BeginAccept 以处理超过 1 个客户端)。然后,当您的程序关闭要求得到满足时,您的 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 回答