gpt4 book ai didi

c - 简单的网络服务器

转载 作者:太空宇宙 更新时间:2023-11-04 04:55:50 25 4
gpt4 key购买 nike

我正在尝试使用 c 编写一个简单的 HTTP 网络服务器,但在尝试创建它时总是遇到问题。关于创建服务器套接字的一切似乎都工作正常;基本上我只是不明白如何将内容发送到浏览器。这是我的代码摘录,其中服务器循环创建与客户端的套接字连接,然后将内容发送到网页:

for (;;) /* Run forever */
{
/* Set the size of the in-out parameter */
clntLen = sizeof(clntAddr);

/* Wait for a client to connect */
if ((clntSock = accept(servSock, (struct sockaddr *) &clntAddr,
&clntLen)) < 0)
DieWithError("accept() failed");

/* clntSock is connected to a client! */

printf("Handling client %s\n", inet_ntoa(clntAddr.sin_addr));

FILE *clientInput = fdopen(clntSock, "r");
char input[1000];
char html[BUFSIZE];

fgets(input, 1000, clientInput);

char *token_separators = "\t \r \n";
char *method = strtok(input, token_separators);
char *requestURI = strtok(NULL, token_separators);
char *httpVersion = strtok(NULL, token_separators);
...
char requestMessage[] = "HTTP/1.0 200 OK\r\n\r\n";
send(clntSock, requestMessage, strlen(requestMessage) + 1, 0);
...

}

我很确定我的代码适用于套接字创建和连接,就在我尝试发送此响应 header 时,我的网页一直在尝试下载 html。当我不发送响应 header 而只是尝试发送普通 html 时,我的页面可以正常工作。

我想我不明白的是为什么我的响应 header 不起作用。

最佳答案

FILE * 带有套接字是非常不寻常的。比较典型的是使用read/recvwrite/send。这使您可以更轻松地进行错误处理。

就是说,如果没有 header ,浏览器会认为您的服务器正在运行 HTTP/0.9——而且一切都是 HTML。为了让事情正常工作,添加另一个:

HTTP/1.0 200 OK
Content-Type: text/html;charset=iso-8859-1

<html>
...

当然,这仍然缺少一些部分,但这是一个开始,大多数浏览器应该毫无怨言地接受它。您可以查看 RFC 并找到您需要支持的请求方法(GET 和 HEAD)以及您需要生成的响应 header (Server、Date)。 (我希望您这样做是出于学习目的,而不是为了生产。)

您可以相当轻松地使用 netcat 测试响应:

$ cat file
HTTP/1.0 200 OK
Content-Type: text/plain

Hello, World
$ nc -l 8000 < file

然后浏览到http://localhost:8000 .请注意,以上内容适用于 BSD netcat,如果您有 GNU netcat,则需要阅读手册页。

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

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