3-4:一个简单的HTTP服务器

Posted 快乐江湖

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了3-4:一个简单的HTTP服务器相关的知识,希望对你有一定的参考价值。

文章目录

HTTP服务器

我们使用浏览器请求某一个网页时,浏览器会向相应的服务器发送请求,服务器得到请求后会将报文传送回来,然后浏览器解析,就形成了我们所看见到的网页

这里我们可以写一个简单的HTTP服务器去模拟一下这个过程,让浏览器请求我的服务器然后返回相应的报文。代码如下,基本就是书写tcp/ip的那一套逻辑

#include <iostream>
#include <string>
#include <cstring>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>

using namespace std;
class HttpServer
{
  private:
    int _port;
    int _lsock;
  public:
    HttpServer(int port):_port(port),_lsock(-1)
  {}
    void InitServer()
    {
      signal(SIGCHLD,SIG_IGN);
      _lsock=socket(AF_INET,SOCK_STREAM,0);
      if(_lsock < 0)
      {
        cerr<<"scoket error"<<endl;
        exit(2);
      }
      struct sockaddr_in local;
      bzero(&local,sizeof(local));
      local.sin_family=AF_INET;
      local.sin_port=htons(_port);
      local.sin_addr.s_addr=INADDR_ANY;
      
      if(bind(_lsock,(struct sockaddr*)&local,sizeof(local)) < 0)
      {
          cerr<<"socke bind error"<<endl;
          exit(3);
      }
      if(listen(_lsock,5) < 0)
      {
        cerr<<"listen error"<<endl;
        exit(4);
      }
    }
    
    void echoHttp(int sock)
    {
      char request[2048];
      size_t s=recv(sock,request,sizeof(request),0);//bug,后序还要做协议处理
      if(s > 0)
      {
        request[s]=0;
        cout << request <<endl;

        string response="HTTP/1.0 200 OK\\r\\n";//响应报头首行
        response += "Content-type: text/html\\r\\n";//响应正文,文件类型
        response +="\\r\\n";
        response +="<h1>This is a sample HttpServer!!!</h1>";
        send(sock,response.c_str(),response.size(),0);

      }
      close(sock);

    }
    
    void Start()
    {
      struct sockaddr_in peer;
      for(;;)
      {
        socklen_t len=sizeof(peer);
        int sock=accept(_lsock,(struct sockaddr*)&peer,&len);
        if(sock < 0) 
        {
          cerr<<"accept error"<<endl;
          continue;
        }
        cout<<"get a new connect"<<endl;
        if(fork()==0)
        {
          close(_lsock);
          echoHttp(sock);
          exit(0);
        }
        close(sock);
        
      }

    }
    ~HttpServer()
    {
      if(_lsock==-1)
      {
        close(_lsock);
      }
    }

};

其中在echoHttp函数中,在拿到一个socket时,我们将接受过来的请求报文保存在一个字符数组中,并输出它。然后使用response这个字符串作为响应报文,返回给服务器,让服务器解析它,返回的文件类型是html。

如下大家可以看到,浏览器接受到了这个简单的HTTP服务器发送过来的回应,并成功解析。
在这里插入图片描述

以上是关于3-4:一个简单的HTTP服务器的主要内容,如果未能解决你的问题,请参考以下文章

简单的方法来分享/讨论/协作的代码片段?

简单的 Javascript http 请求片段但不起作用

node 环境下简单web服务器搭建代码

在一个无序整数数组中,找出连续增长片段最长的一段, 增长步长是1。Example: [3,2,4,5,6,1,9], 最长的是[4,5,6]

IOS开发-OC学习-常用功能代码片段整理

Apollo Codegen 没有找到生成代码的操作或片段