Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
让C++不再等待用户输入 >我尝试制作一个C++ WiSoCK2聊天,只是为了学习。 这是一个控制台应用程序,我希望接收用户输入以发送到对应的应用程序,但我仍然希望能够接收。所以你可以在仍然能够接收信息的情况下写一条信息_C++_Input_Chat_Winsock_Winsock2 - Fatal编程技术网

让C++不再等待用户输入 >我尝试制作一个C++ WiSoCK2聊天,只是为了学习。 这是一个控制台应用程序,我希望接收用户输入以发送到对应的应用程序,但我仍然希望能够接收。所以你可以在仍然能够接收信息的情况下写一条信息

让C++不再等待用户输入 >我尝试制作一个C++ WiSoCK2聊天,只是为了学习。 这是一个控制台应用程序,我希望接收用户输入以发送到对应的应用程序,但我仍然希望能够接收。所以你可以在仍然能够接收信息的情况下写一条信息,c++,input,chat,winsock,winsock2,C++,Input,Chat,Winsock,Winsock2,使用cin>>输入时;程序暂停,直到用户输入了某个内容,这样它是基于回合的。一个用户写入某个内容并发送它,然后另一个用户写入某个内容并发送它 是否有一种方法可以让用户在recive stuff仍在运行时编写一些内容?最好是多线程以外的东西检查缓冲区是否为空怎么样?但那个么代码就不会是真正可移植的,因为正如我所知,您需要进行一些系统调用。看见 但也许你可以用一些C代码,我会做一些研究,更新我的答案 UPD:好的,我做到了。你需要的是功能。 它可以等到stdin准备好读取,这就是我们需要的。 但是看

使用cin>>输入时;程序暂停,直到用户输入了某个内容,这样它是基于回合的。一个用户写入某个内容并发送它,然后另一个用户写入某个内容并发送它


是否有一种方法可以让用户在recive stuff仍在运行时编写一些内容?最好是多线程以外的东西

检查缓冲区是否为空怎么样?但那个么代码就不会是真正可移植的,因为正如我所知,您需要进行一些系统调用。看见 但也许你可以用一些C代码,我会做一些研究,更新我的答案

UPD:好的,我做到了。你需要的是功能。 它可以等到stdin准备好读取,这就是我们需要的。 但是看起来它不适用于C++流,所以你只需要使用C代码来阅读。 让我们跳转到定义: int selectint nfds,fd_set*readfds,fd_set*writefds,fd_set*errorfds,struct timeval*超时

好的,我们只需要检查读缓冲区,所以writefds和errorfds可以为空。我们只需要检查stdin,所以nfds是1个FDSE

超时呢?它应该是0,所以我们需要初始化变量struct timeval timeout,并通过timeout.tv_sec=0和timeout.tv_usec=0将秒和纳秒设置为0

所以,只剩下readfds了。它也非常简单:我们需要初始化变量,将其归零,然后添加stdin。 可以使用fd_set readfds、fd_ZERO&readfds和fd_settdin_FILENO&readfds执行此操作

好的,最后一步:函数调用。它应该是select1、readfds、NULL、NULL和timeout

如果输入缓冲区为空,则返回0,否则返回1

UPD2:看起来不是C++流,有些奇怪的事情发生,当缓冲区在第一次调用时空了,它会中断。我会尽力抓住这个问题

UPD3:好的,现在我明白了。看起来你可以用C++流来选择。p> Select具有非常奇怪的IMHO功能:它重置readfds。我不知道如何防止它这样做,所以我只使用了另一个fd_set变量来保存它,所以您需要在readfds初始化之后添加fd_set savefds=readfds,并在每次调用之后添加readfds=savefds。这是一个糟糕的解决方案,但我不知道如何才能改进它

所以代码是:

初始化:

超时初始化:

使用方法:

UPD4:别忘了包括unistd.h和cstdlib,这非常有用

下面是一个示例基本代码,取自:

包括 包括 包括 包括 包括 包括 int mainvoid { fd_设置RFD,保存RFD; 结构时间值电视; 内部检索; /*观察stdin fd 0,查看其何时有输入*/ FD_ZERO&rfds; FD_SET0和rfds; /*创建RFD的副本,因为在运行select之后,它会被重置*/ 保存\u rfds=rfds; /*等待0秒*/ tv.tv_sec=0; tv.tv_usec=0; whiletrue{ retval=select1,&rfds,NULL,NULL,&tv; rfds=保存\u rfds; 如果retval==-1 佩罗尔当选; 否则,如果返回{ /*输入值并按enter键后立即运行*/
std::coutTake看一看。你可能应该从不同的线程管理你自己的缓冲区,并自己处理同步。单独的线程可能是一种滥杀滥伤。你需要事件解复用。我所知道的唯一多平台api是select。windows实现……至少缺少一点。我要说的是将std::thread与som一起使用e基本同步和回调应该可以完成这项工作。您也可以使用select检查套接字,因此这是最好的解决方案。这是一个windows WinSock问题,并且您没有共享与windows兼容的代码。即使我将STDIN_FILENO替换为其实际值,但在实际尝试使用select时仍会出现未解决的外部符号错误s-writed,Windows没有unistd.h。
fd_set readfds;
FD_ZERO(&readfds);
FD_SET(STDIN_FILENO, &readfds);
fd_set savefds = readfds;  
struct timeval timeout;
timeout.tv_sec = 0;
timeout.tv_usec = 0;
if (select(1, &readfds, NULL, NULL, &timeout)) {
  cin >> input;
  send(input);
}
readfds = savefds;