首先,我知道要创建处理静态html页面的Web服务器。

我想创建一个支持PHP页面的Web服务器。

我已经将服务器编码如下
-> main()函数只是创建一个套接字,接受请求并调用connection(fd)函数。

int main(int argc, char *argv[]) {
     int sockfd, newsockfd, portno, pid;
     socklen_t clilen;
     struct sockaddr_in serv_addr, cli_addr;

     if (argc < 2) {
          fprintf(stderr, "ERROR, no port provided\n");
          exit(1);
     }
     sockfd = socket(AF_INET, SOCK_STREAM, 0);
     if (sockfd < 0)
         error("ERROR opening socket");
     bzero((char *) &serv_addr, sizeof(serv_addr));
     portno = atoi(argv[1]);
     serv_addr.sin_family = AF_INET;
     serv_addr.sin_addr.s_addr = INADDR_ANY;
     serv_addr.sin_port = htons(portno);
     if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
        error("ERROR on binding");
     listen(sockfd, 5);
     clilen = sizeof(cli_addr);
     /*
      Server runs forever, forking off a separate
      process for each connection.
      */
     while (1) {
          newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
          if (newsockfd < 0)
             error("ERROR on accept");
          pid = fork();

          if (pid < 0)
              error("ERROR on fork");
          if (pid == 0) {
               close(sockfd);
               connection(newsockfd);
               exit(0);
          } else
            close(newsockfd);
     } /* end of while */
     close(sockfd);
     return 0; /* we never get here */
}


-> connection()函数设置文档根目录,并显式设置PHP页面(echo.php)并调用php-cgi()函数。 php-cgi()做进一步的处理。

其实我不知道php5-cgi是做什么的。当我运行服务器并从Web浏览器请求页面时,它显示1秒钟的“ Am a PHP文件”,然后隐藏并显示消息,


  连接被重置


1)在Web服务器中处理php页面的正确方法是什么

2)谁能建议我一些书籍或任何东西来开发用C语言处理PHP页面的Web服务器?

3)我想尝试其他语言吗?哪种是创建Web服务器和代理的最佳语言?

4)如何处理查询字符串和POST方法请求?

当我将telnet连接到服务器时,

GET /echo.php HTTP/1.1
HTTP/1.1 200 OK
X-Powered-By: PHP/5.5.9-1ubuntu4.6
Content-type: text/html

<html>
<body>
Am a PHP file
</body>
</html>

最佳答案

您缺少一些HTTP标头字段。问题之一是浏览器不知道需要多少数据。因此,当它接收并解析数据时,由于您的PHP脚本结束并且浏览器转到“嗯?”,因此连接已关闭。

因此,您必须发送Content-length标头(如果您事先知道身体的长度)或Transfer-encoding字段(请参见http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2)。第一种解决方案增加了另一个问题:您必须在发送标头之前确定长度。这意味着将所有输出捕获到缓冲区中,对字节进行计数,然后发送标头,然后发送内容。但这会在您的代码中添加另一个fork()...我尝试添加Transfer-Encoding: identity之类的标头,但效果不佳。您可能还需要添加Connection: close标头。

您的其他问题有点广泛;不管使用哪种语言,您都必须完成解析HTTP请求标头,组装标头,派生,解析参数等所有艰苦的工作。从理论上讲,使用fork(),execl()的方法是合理的,但需要还有很多工作。所以,是的,使用Apache,nginx或任何其他Web服务器听起来很诱人...

关于php - 如何用C创建支持PHP页面的Web服务器?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28955289/

10-11 20:09
查看更多