我最近开始学习用C语言进行套接字编程,在网上学习了一个教程之后,我最终得到了一个服务器的代码,该服务器加载了一个可以在浏览器中查看的html文件:
int main(void) {
FILE * html_data;
if ((html_data = fopen("index.html", "r")) == NULL) {
puts("File Not Found");
exit(1);
}
char response_data[1024];
fgets(response_data, 1024, html_data);
char http_header[2048] = "HTTP/1.1 200 OK\r\n\n";
strcat(http_header, response_data);
int server_socket = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(4999);
server_addr.sin_addr.s_addr = INADDR_ANY;
bind(server_socket, (struct sockaddr *) &server_addr, sizeof(server_addr));
listen(server_socket, 5);
int client_socket;
while (1) {
client_socket = accept(server_socket, NULL, NULL);
send(client_socket, http_header, sizeof(http_header), 0);
shutdown(client_socket, 2);
}
return 0;
}
我第一次尝试用浏览器(Brave Browser)连接到这个服务器时,我可以连接到它,但我看到的是一个空白页面。后来我发现加载html的唯一方法是将所有内容都放在一行上,就像下面这样:
<!DOCTYPE html><html><body><p>HELLO WORLD</p></body></html>
有什么原因会这样吗?这是一个非常奇怪的怪癖,我不知道它为什么会这样工作。我也在Firefox上试过这个,以确保这不仅仅是一个 chrome 的事情。有人能启发我吗?谢谢。
1条答案
按热度按时间qrjkbowd1#
您需要检查所调用的所有函数的返回值。
考虑至少在开发时设置套接字选项
SO_REUSEADDR
,这样您就不必等待tcp/ip超时来再次启动服务器。下面是使用
sendfile()
的示例。read()
使用类似的调用模式。您没有提供多行index.html,但使用我的测试文件curl localhost:4999返回: