gpt4 book ai didi

c - 软终止一个简单的网络服务器

转载 作者:太空宇宙 更新时间:2023-11-03 23:51:48 24 4
gpt4 key购买 nike

我正在构建自己的网络服务器。现在,我的极简代码是:

#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”字母时……

最佳答案

为什么不取消所有这些写入函数而只使用一个 send()?

您需要做的就是将您的响应存储在缓冲区中,然后发送缓冲区:

// Global
#define MAX 2048
char response[MAX]; // No need for char*

// In Main
memset(response, 0, MAX); // **EDIT**
strcpy(response, "HTTP/1.1 200 OK\n");
strcat(response, "Content-length: 50\n");
strcat(response, "Content-Type: text/html\n\n");
strcat(response, "<html><body><h1>Hello world!!!</h1></body></html>\n");

// Now simply send the whole response in one go:
send(nReqSocketId, response, strlen(response), 0);

此外,您还可以像这样简单地将其设为非持久连接:

// Global
#define MAX 2048
char response[MAX]; // No need for char*

// In Main
memset(response, 0, MAX); // **EDIT**
strcpy(response, "HTTP/1.1 200 OK\n");
strcat(response, "Content-Type: text/html\n\n");
strcat(response, "<html><body><h1>Hello world!!!</h1></body></html>\n");

// Now simply send the whole response in one go again:
send(nReqSocketId, response, strlen(response), 0);

// Shutdown the socket so it cannot write anymore:
shutdown(nReqSocketId,1);

// Then totally close it when you are ready:
close(nReqSocketId);

后者可能更适合您目前正在做的事情;因为无论如何您都不会在您的网络服务器中保持多个连接。

一旦您关闭服务器端的连接,客户端(即网络浏览器)就会知道停止期待内容并将正确完成工作。

希望这对您有所帮助。

干杯!

附言-

当然,这是对您在该线程中最后一个问题的回答,与其说是软终端部分。

我还必须建议您使用 memset(response, 0, MAX) 以便每次响应时都能保持干净的状态。

关于c - 软终止一个简单的网络服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18533346/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com