C# 如何使用C中的套接字访问标准输入?
我试图在聊天程序中管理客户端。 因此,客户端应该从键盘获取输入并将其发送到服务器。 同时,它应该能够从服务器接收masseges 在C中,我们有select函数,在linux中,stdin有一个文件描述符,因此我可以使用select来指示何时stdin或套接字可以读取 我的问题: 如何在C和windows中实现这一点? Socket.Select只接受套接字,但StandardInput是一个流。如何在Select中使用它? 我知道我可以使用另一个线程来监视stdin,但我正在寻找一个在一个线程中处理它的解决方案。 总的来说,这就是我想要做的: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,但我正在寻找一个在一个线程
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,这意味着它是在循环中发生的。那么,当异步读取可能只是每个迭代中准备读取的流之一时,如何在循环中使用异步读取呢?