在用 scoket 实现简单 web 服务器时,对客户端 fd write 的时候遇到的一点困惑

如下代码,当我在浏览器中访问的时候,
如果 char web_result[] = "hello world" 的时候就正常输出到浏览器,提示要我下载该文件。如果换成html协议的内容,就不能输出了,是什么问题呢?

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
 
#define SERV_PORT 8031

char* server_output();

int main(void)
{
    int lfd, cfd;
    struct sockaddr_in serv_addr,clin_addr;
    socklen_t clin_len;
    char buf[1024];
    int len;
 
    lfd = socket(AF_INET,SOCK_STREAM,0);
     
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    serv_addr.sin_port = htons(SERV_PORT);
    
    bind(lfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr));
     
    listen(lfd, 128);

    while(1){
        clin_len = sizeof(clin_addr);
        cfd = accept(lfd, (struct sockaddr *)&clin_addr, &clin_len);
        len = read(cfd,buf,sizeof(buf));
        write(STDOUT_FILENO,buf,len);
        
        char web_result[] = "HTTP/1.1 200 OK\r\nContent-Length: 12\r\nServer: mengkang\r\n\r\nhello world";
        //char web_result[] = "hello world";

        write(cfd,web_result,sizeof(web_result));

        close(cfd);
    }

    close(lfd);
    
    return 0;
}

我又做了下小实验,如果我把长度写成12,而且同时在写入客户端 fd 的前后分别打印一次,就能输出到客户端,而且在输出的内容后面跟过去一个小红点。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
 
#define SERV_PORT 8031

char* server_output();

int main(void)
{
    int lfd, cfd;
    struct sockaddr_in serv_addr,clin_addr;
    socklen_t clin_len;
    char buf[1024];
    int len;
 
    lfd = socket(AF_INET,SOCK_STREAM,0);
     
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    serv_addr.sin_port = htons(SERV_PORT);
    
    bind(lfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr));
     
    listen(lfd, 128);

    while(1){
        clin_len = sizeof(clin_addr);
        cfd = accept(lfd, (struct sockaddr *)&clin_addr, &clin_len);
        len = read(cfd,buf,sizeof(buf));
        write(STDOUT_FILENO,buf,len);
        
        char web_result[] = "HTTP/1.1 200 OK\r\nContent-Type:text/html\r\nContent-Length: 12\r\nServer: mengkang\r\n\r\nhello world";
        
        printf("\n");
        
        write(cfd,web_result,sizeof(web_result));
        
        printf("\n");

        close(cfd);
    }

    close(lfd);
    
    return 0;
}

图片描述

阅读 2.2k
评论
    1 个回答
    • 12k

    在HTTP头里面加一个 Content-Type:text/html或是Content-Type:text/plain试试,不太确定
    “hello world”的长度只有11吧?发给浏览器的信息,不包括最后那个 "\0" 是指具体承载数据的大小。

      撰写回答

      登录后参与交流、获取后续更新提醒