C 简单Web服务器

C 简单Web服务器,c,http,sockets,webserver,C,Http,Sockets,Webserver,我正在尝试使用c编写一个简单的HTTP web服务器,但在尝试创建它时一直遇到问题。关于创建服务器套接字的一切似乎都很好;基本上,我只是不知道如何将内容发送到浏览器。以下是我的代码摘录,其中服务器循环创建与客户端的套接字连接,然后将内容发送到网页: for (;;) /* Run forever */ { /* Set the size of the in-out parameter */ clntLen = sizeof(clntAddr);

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

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);
        ...  

}
(;;)/*的
永远运行*/
{
/*设置输入输出参数的大小*/
clntLen=sizeof(clntAddr);
/*等待客户端连接*/
如果((clntSock=accept)(servSock,(struct sockaddr*)和clntAddr,
&clntLen))<0)
DIEWERROR(“接受()失败”);
/*clntSock已连接到客户端*/
printf(“处理客户端%s\n”,inet_ntoa(clntAddr.sin_addr));
文件*clientInput=fdopen(clntSock,“r”);
字符输入[1000];
字符html[BUFSIZE];
fgets(输入,1000,客户端输入);
char*token_分隔符=“\t\r\n”;
char*method=strtok(输入,令牌分隔符);
char*requestURI=strtok(空,令牌分隔符);
char*httpVersion=strtok(空,令牌分隔符);
...
char requestMessage[]=“HTTP/1.0 200正常\r\n\r\n”;
发送(clntSock,requestMessage,strlen(requestMessage)+1,0);
...  
}
我很确定我的代码适用于套接字创建和连接,就在我尝试发送此响应标题时,我的网页一直在尝试下载html。当我不发送响应头,但尝试发送普通html时,我的页面工作正常


我想我不明白的是为什么我的回复标题不起作用

看到带有套接字的
文件*
是非常罕见的。更典型的是使用
读取
/
接收
写入
/
发送
。这使您可以更轻松地处理错误

这就是说,如果没有标题,浏览器会认为您的服务器正在运行HTTP/0.9,而所有内容都是HTML。为了使事情正常运行,请添加另一个:

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

<html>
...
HTTP/1.0 200正常
内容类型:text/html;字符集=iso-8859-1
...
当然,这仍然缺少一些内容,但这只是一个开始,大多数浏览器应该毫无怨言地接受它。您可以查看RFC,找到需要支持的请求方法(GET和HEAD)以及需要生成的响应头(服务器、日期)。(我希望您这样做是为了学习,而不是为了生产。)

您可以非常轻松地使用netcat测试响应:

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

Hello, World
$ nc -l 8000 < file
$cat文件
HTTP/1.0 200正常
内容类型:文本/纯文本
你好,世界
$nc-L8000<文件

然后浏览到。注:上述内容适用于BSD netcat,如果您有GNU netcat,则需要阅读手册页。

我认为这有帮助。是否有方法更改内容类型以同时显示图像?您必须为要发送的特定类型的图像指定正确的内容类型,即:
image/bmp
image/jpeg
image/gif
image/png
,等等。