C# 如何使用C中的套接字访问标准输入?

C# 如何使用C中的套接字访问标准输入?,c#,sockets,select,stdin,single-threaded,C#,Sockets,Select,Stdin,Single Threaded,我试图在聊天程序中管理客户端。 因此,客户端应该从键盘获取输入并将其发送到服务器。 同时,它应该能够从服务器接收masseges 在C中,我们有select函数,在linux中,stdin有一个文件描述符,因此我可以使用select来指示何时stdin或套接字可以读取 我的问题: 如何在C和windows中实现这一点? Socket.Select只接受套接字,但StandardInput是一个流。如何在Select中使用它? 我知道我可以使用另一个线程来监视stdin,但我正在寻找一个在一个线程

我试图在聊天程序中管理客户端。 因此,客户端应该从键盘获取输入并将其发送到服务器。 同时,它应该能够从服务器接收masseges

在C中,我们有select函数,在linux中,stdin有一个文件描述符,因此我可以使用select来指示何时stdin或套接字可以读取

我的问题:

如何在C和windows中实现这一点? Socket.Select只接受套接字,但StandardInput是一个流。如何在Select中使用它? 我知道我可以使用另一个线程来监视stdin,但我正在寻找一个在一个线程中处理它的解决方案。 总的来说,这就是我想要做的:

        public void Run()
        {
            clientSide.Connect(ipEndPoint);
            //-> make a Socket for stdin:
            //-> Socket stdinSocket = new Socket(????);
            List<Socket> checkReadList = new List<Socket>();
            checkReadList.Add(clientSide);
            checkReadList.Add(stdinSocket);

            while (CanRun())
            {
                Socket.Select(checkReadList, null, null, -1);
                foreach(Socket current in checkReadList)
                {
                     if(stdinSocket == current)
                     {
                         Console.ReadLine(.....);
                         ....
                     }
                     if (clientSide == current)
                     {
                         SendMessageToServer(...);
                     } 
            }
        }


谢谢

您可以使用NetworkStream包装一个套接字,您能改变程序的逻辑以利用流而不是套接字吗?@Matthew但问题仍然存在:如何从一个线程监视两个流从根本上说,我质疑您为什么要这样做;如果这是我,我将分别在套接字和stdin上使用异步读取,并且零线程使用线程池进行IO回调等;通过使用Socket.Select here,您试图获得什么?@MarcGravel老实说,我不知道OP为什么希望他们的解决方案是单线程的,但他们可以在循环中的流之间交替,可能会使用StreamReader在阻塞之前查看数据是否可用。我同意异步在这里最有意义,但我不确定OP在线程使用方面有多严格。@MarcGravel。客户端总是侦听服务器和stdin,这意味着它是在循环中发生的。那么,当异步读取可能只是每个迭代中准备读取的流之一时,如何在循环中使用异步读取呢?