【发布时间】:2013-08-30 12:49:54
【问题描述】:
我正在构建自己的网络服务器。目前,我的极简代码是:
#include <stdio.h>
#include <stdlib.h>
#include <netinet/in.h>
#define SERVER_PORT 80
int main () {
int nReqSocketId, nReqSize = 1024, nMainSocketId = socket(AF_INET, SOCK_STREAM, 0);
char *sRequest = malloc(nReqSize);
socklen_t nAddrLen;
struct sockaddr_in oAddress;
oAddress.sin_family = AF_INET;
oAddress.sin_addr.s_addr = INADDR_ANY;
oAddress.sin_port = htons(SERVER_PORT);
if (nMainSocketId == 0) {
fprintf(stderr, "Error during the creation of the socket\n");
return 1;
}
if (bind(nMainSocketId, (struct sockaddr *) &oAddress, sizeof(oAddress))) {
fprintf(stderr, "The port %d is busy\n", SERVER_PORT);
close(nMainSocketId);
return 1;
}
printf("HTTP server listening on port %d\n", SERVER_PORT);
while (1) {
if (listen(nMainSocketId, 10) < 0) {
perror("server: listen");
close(nMainSocketId);
exit(1);
}
nReqSocketId = accept(nMainSocketId, (struct sockaddr *) &oAddress, &nAddrLen);
if (nReqSocketId < 0) {
perror("server: accept");
close(nMainSocketId);
exit(1);
}
recv(nReqSocketId, sRequest, nReqSize, 0);
if (nReqSocketId > 0){
printf("The Client is connected...\n\n%s\n", sRequest);
}
write(nReqSocketId, "HTTP/1.1 200 OK\n", 16);
write(nReqSocketId, "Content-length: 50\n", 19);
write(nReqSocketId, "Content-Type: text/html\n\n", 25);
write(nReqSocketId, "<html><body><h1>Hello world!!!</h1></body></html>\n", 50);
close(nReqSocketId);
}
printf("Goodbye!\n");
close(nMainSocketId);
return 0;
}
我可以创建一个“软关闭机制”让网络服务器打印“再见!”位于无限循环之后的短语?例如,当我输入“q”字母时……
【问题讨论】:
-
您想从服务器的终端窗口或从客户端请求软终止它? (或两者兼而有之?)前者高度特定于操作系统,因为您不能在 nx 和 Windows 上以相同的方式在终端上等待。后者就像解析 HTTP 请求一样简单。
-
Ctrl + C 和 SIGINT 的处理程序。
-
@Medinoc 我想从我的 linux 服务器的终端窗口软终止它!
-
@someuser Ctrl + C 在 printf("Goodbye!\n");
-
@user2732907 这就是为什么 Medinoc 说“和 SIGINT 的处理程序”。为 SIGINT 安装一个信号处理程序,将 volatile 整数设置为零,并让该 volatile 整数成为循环的控制表达式。