簡單HTTP伺服器實現
阿新 • • 發佈:2018-11-01
我們這裡實現一個簡單的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); } }