【发布时间】:2018-09-02 21:24:09
【问题描述】:
我正在尝试找到一种在服务器侦听传入客户端连接时安全关闭服务器的方法,而无需在 linux 中使用经典的 ctrl+C 。我想终止程序,例如通过键盘输入 Q 或 -quit 等... 在按下 enter 后立即这样做,而不是在接受之后,例如客户端连接。我应该如何实现这个?
这是我的示例代码。
int startSocketConnection() {
socketFD = socket(AF_INET, SOCK_STREAM, 0);
//TODO exceptions
if (socketFD < 0) {
std::cout << "\nError establishing socket...\nexiting..." << std::endl;
return (-1);
}
std::cout << "\nSocket server has been created..." << std::endl;
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htons(INADDR_ANY);
server_addr.sin_port = htons(portNum);
//TODO exceptions
if ( (bind(socketFD, (struct sockaddr*) &server_addr, sizeof(server_addr))) < 0 ) {
std::cout << "Error binding connection, Socket has already been established" << std::endl;
return (-1);
}
std::cout << "Listening for incoming client connection..." << std::endl;
listen(socketFD, 1);
size = sizeof(client_addr);
while (sessionActive) {
newSocketFD = accept(socketFD, (struct sockaddr *) &client_addr, &size);
if (newSocketFD < 0) error("ERROR on accept");
//fork() returns child pid to parent, 0 to the child process.
pid = fork();
if (pid < 0) error("ERROR on fork");
//if child process...
if (pid == 0) {
close(socketFD);
//process client query...
sessionActive = dostuff(newSocketFD);
signal(SIGCHLD, SIG_IGN);
std::cout << "Child process terminated!" << std::endl;
exit(0);
}
else {
close(newSocketFD);
}
}
close(socketFD);
return 0;
}
【问题讨论】:
-
如果你读过几本书或教程,我想你应该见过 non-blocking 套接字和
select调用的使用吗?两者都是帮助您解决问题的有用工具。还要记住,在 POSIX(如 Linux)环境中,套接字和文件都是相同的,都是 描述符。还要记住,标准输入是一个可以像任何其他文件一样读取的文件(例如从STDIN_FILENO描述符)。 -
@Someprogrammerdude 不幸的是,我对编写网络服务器一无所知。甚至我写的那一篇也几乎是复制粘贴的。不过感谢您提供的信息。
标签: c++ linux server serversocket