如何用C++输入键盘输入侦听TCP服务器

如何用C++输入键盘输入侦听TCP服务器,c++,linux,server,serversocket,C++,Linux,Server,Serversocket,我试图找到一种方法,在服务器侦听传入的客户端连接时安全地关闭服务器,而不必在linux中使用经典的ctrl+C。我想终止程序,例如通过键盘输入Q或-退出等。。。并在按enter键后立即执行,而不是在接受(例如)客户端连接后。我应该如何实现这一点? 这是我的示例代码 int startSocketConnection{ socketFD=socketAF_INET,SOCK_STREAM,0; //待办事项例外 如果socketFD

我试图找到一种方法,在服务器侦听传入的客户端连接时安全地关闭服务器,而不必在linux中使用经典的ctrl+C。我想终止程序,例如通过键盘输入Q或-退出等。。。并在按enter键后立即执行,而不是在接受(例如)客户端连接后。我应该如何实现这一点? 这是我的示例代码

int startSocketConnection{ socketFD=socketAF_INET,SOCK_STREAM,0; //待办事项例外 如果socketFD<0{
std::cout您需要添加另一个从stdin读取并在应用程序看到这些命令时不客气地退出的线程,或者更改代码以使用类似命令或查看哪些描述符有可用的输入:为stdin添加描述符出于您的目的,您可以相信它与列表的描述符一起为0打开套接字,当其中一个或两个都有输入事件时,您的select或poll将返回,并且-如果它告诉您stdin有数据-您可以在不阻塞的情况下从中读取:如果您看到终止命令,请退出

对于select/poll,您应该将调用accept的套接字设置为non blocking,因为可能会收到传入连接尝试的通知,但在您接受该连接时,该连接可能已经失败-您不希望accept也为您阻止和停止select或poll呼叫监控stdin

在这两个线程中,额外的线程是最简单的——这里有一个简单的程序,说明如何启动它,并让它在主线程自己工作时监视stdin


如果您希望有序关闭,那么它确实会变得更复杂一些,因为主线程中对象的析构函数可以保证运行……

如果您读过一些书或教程,我想您已经看到了非阻塞套接字和select调用的用法?这两种方法都是帮助您解决问题的有用工具。还要记住,套接字和文件在类似POSIX的Linux环境中都是一样的,都是描述符。还要记住,标准输入是一个可以像其他任何文件一样从中读取的文件,例如从STDIN_FILENO描述符中读取的文件。@Someprogrammerdude不幸的是,我对编写网络服务器没有任何知识。即使是我编写的也几乎是复制粘贴的。谢谢你的帮助不过,信息还是很简单。谢谢你的回复。这确实比我预期的要复杂。只需添加一个简单的额外功能!线程方法非常简单-请参阅我在回答中附加的示例代码。
#include <thread>
#include <iostream>
#include <string>
#include <unistd.h> // for sleep

int main()
{
    std::thread t{
        [] {
            std::string s;
            while (std::cin >> s)
                if (s == "exit")
                {
                    std::cout << "exit command given on stdin\n";
                    exit(0);
                }
        }
    };
    t.detach();

    while (true)
    {
        sleep(2);
        std::cout << "beat\n";
    }
}