嵌入式linux最簡單webserver
阿新 • • 發佈:2019-02-02
現在智慧家居越來越多了,好多裝置都可以用手機控制,而手機通常又通過wifi網路與裝置互動!
特點是實時性要求不高,而且都是隨時進行的,所以很想訪問web頁面,所以http方式很適合
以下是linux簡單web原始碼,可以放入到嵌入式裝置,通過web或者app可以控制和查詢硬體資訊,比如
書梅派
#include <stdio.h> #include <netinet/in.h> #include <sys/socket.h> // socket #include <sys/types.h> // 基本資料型別 #include <unistd.h> // read write #include <string.h> #include <stdlib.h> #include <fcntl.h> // open close #include <sys/shm.h> #include <signal.h> #define PORT 8888 #define SERV "0.0.0.0" #define QUEUE 20 #define BUFF_SIZE 1024 typedef struct doc_type{ char *key; char *value; }HTTP_CONTENT_TYPE; HTTP_CONTENT_TYPE http_content_type[] = { { "html","text/html" }, { "gif" ,"image/gif" }, { "jpeg","image/jpeg" } }; int sockfd; char *http_res_tmpl = "HTTP/1.1 200 OK\r\n" "Server: Cleey's Server V1.0\r\n" "Accept-Ranges: bytes\r\n" "Content-Length: %d\r\n" "Connection: close\r\n" "Content-Type: %s\r\n\r\n"; void handle_signal(int sign); // 退出訊號處理 void http_send(int sock,char *content); // http 傳送相應報文 int main(){ signal(SIGINT,handle_signal); int count = 0; // 計數 // 定義 socket sockfd = socket(AF_INET,SOCK_STREAM,0); // 定義 sockaddr_in struct sockaddr_in skaddr; skaddr.sin_family = AF_INET; // ipv4 skaddr.sin_port = htons(PORT); skaddr.sin_addr.s_addr = inet_addr(SERV); // bind,繫結 socket 和 sockaddr_in if( bind(sockfd,(struct sockaddr *)&skaddr,sizeof(skaddr)) == -1 ){ perror("bind error"); exit(1); } // listen,開始新增埠 if( listen(sockfd,QUEUE) == -1 ){ perror("listen error"); exit(1); } // 客戶端資訊 char buff[BUFF_SIZE]; struct sockaddr_in claddr; socklen_t length = sizeof(claddr); while(1){ int sock_client = accept(sockfd,(struct sockaddr *)&claddr, &length); printf("%d\n",++count); if( sock_client <0 ){ perror("accept error"); exit(1); } memset(buff,0,sizeof(buff)); int len = recv(sock_client,buff,sizeof(buff),0); fputs(buff,stdout); //send(sock_client,buff,len,0); http_send(sock_client,"Hello World!"); close(sock_client); if(count > 3) break; } fputs("Bye Cleey",stdout); close(sockfd); return 0; } void http_send(int sock_client,char *content){ char HTTP_HEADER[BUFF_SIZE],HTTP_INFO[BUFF_SIZE]; int len = strlen(content); sprintf(HTTP_HEADER,http_res_tmpl,len,"text/html"); len = sprintf(HTTP_INFO,"%s%s",HTTP_HEADER,content); send(sock_client,HTTP_INFO,len,0); } void handle_signal(int sign){ fputs("\nSIGNAL INTERRUPT \nBye Cleey! \nSAFE EXIT\n",stdout); close(sockfd); exit(0); }