1. 程式人生 > >簡單HTTP伺服器實現

簡單HTTP伺服器實現

   我們這裡實現一個簡單的HTTP伺服器,無論瀏覽器向我們請求什麼資料,我們都返回一個hello world

  

//實現最簡單的http服務端程式
//返回hello world
//http是應用協議,在傳輸層使用的是tcp協議所以我們的程式本質上是tcp伺服器
//我們http指定監聽10000埠,所以在請求訪問的時候也要手動指定否則預設80埠

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<errno.h>
#include<sys/socket.h>
#include<netinet/in.h>

int main(int argc,char* argv[])
{
    int sockfd=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    if(sockfd<0)
    {
        perror("socket error\n");
        return -1;
    }
    struct sockaddr_in lst_addr;
    lst_addr.sin_family=AF_INET;
    lst_addr.sin_port=htons(9998);
    lst_addr.sin_addr.s_addr=inet_addr("192.168.76.130");
    socklen_t len=sizeof(struct sockaddr_in);
    int ret=bind(sockfd,(struct sockaddr*)&lst_addr,len);
    if(ret<0)
    {
        perror("bind error\n");
        return -1;
    }
    if(listen(sockfd,5)<0)
    {
        perror("listen error\n");
        return -1;
    }
    while(1)
    {
        struct sockaddr_in cli_addr;
        int newfd=accept(sockfd,(struct sockaddr*)&cli_addr,&len);
        if(newfd<0)
        {
            perror("accept error\n");
            continue;
        }
        char buff[1024]={0};
        int ret=recv(newfd,buff,1023,0);
        if(ret>0)
        {
            printf("req:%s\n",buff);
			//這裡我們列印的是瀏覽器HTTP的請求頭部
        }
        //返回的http頭部資訊要包括
        //首行 HTTP/1.1 200 OK
        //頭資訊:
        // 空行
        // 正文
        char *rsp="<h1>hello world</h1>";
        memset(buff,0x00,1024);
        sprintf(buff,"%s\r\n%s%d\r\n%s\r\n\r\n%s%","HTTP/1.1 200 OK","Content-Length: ",strlen(rsp),"Content-Type:text/html:charset=UTF-8",rsp);
		//這裡我們返回的是簡單的字串hello world
		//%s \r\n 第一行輸出了HTTP/1.1 200 OK
		//%S %d \r\n 這裡第二行輸出了Content-Length: strlen(rsp) 這裡我們是想通過這個關鍵字告訴瀏覽器我們這次傳送的資料是多少
		//%s \r\n 這一行輸出了Content-Type:text/html:charset=UTF-8 是告訴瀏覽器我們的檔案格式和編碼格式
		//\r\n 這一行是HTTP頭部頭部和正文之間的空行
		//%s 這裡才是我們最終傳輸的資料
		//這一部分的內容才真正算是我們的HTTP協議的部分,這裡是我們用HTTP協議和瀏覽器交流的部分。
		printf("%s", buff);
        send(newfd,buff,strlen(buff),0);
        close(newfd);
    }
}

 

當我們執行程式之後,在瀏覽器輸入網路地址:網路號就可以來訪問我們的伺服器。第一次很有可能會失敗,因為我們的Linux有防火牆,這裡我們必須要關閉一下Linux自身的防火牆。

運用 sudo service iptables stop來關閉我們系統的防火牆。

然後執行我們的程式,之後在瀏覽器輸入192.168.76.130:9998

這是瀏覽器給我們的請求頭資訊

這裡我們也列印了我們給瀏覽器的頭資訊和資料

這時候我們看我們的瀏覽器

能夠正常返回我們的hello world代表伺服器沒有問題。