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服务器的主要内容,如果未能解决你的问题,请参考以下文章
在一个无序整数数组中,找出连续增长片段最长的一段, 增长步长是1。Example: [3,2,4,5,6,1,9], 最长的是[4,5,6]