如下代码,当我在浏览器中访问的时候,
如果 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;
}
在HTTP头里面加一个 Content-Type:text/html
或是Content-Type:text/plain
试试,不太确定
“hello world”的长度只有11吧?发给浏览器的信息,不包括最后那个 "\0" 是指具体承载数据的大小。