c语言编写http服务器

xiaoxiao2021-03-01  64

一直想弄一下http服务器,一直没有深入的去看http协议。

昨天研究了一天,查看源码和优化,终于实现了。也稍微的理解了一下http协议。

身为一个嵌入式工程师,需要了解http协议吗?显然是必要的,

例如:你有一个网络设备,必要需要设置和获取一些参数,你可以使用如串口之类的通讯总线,不过实现起来并不简单,

需要实现上位机和下位机程序,协议还得自己编写和解析,如果上位机要有界面的话,还得做界面,确实挺麻烦的。

既然是网络设备,比如是rj45,wifi,里面一般都带有tcp/ip协议,用它来实现一个http服务器,那么上位机就可以直接使用

浏览器作为媒介了。

用浏览器作为控制媒介,那就需要了解http协议了。下面简单的用c语言实现一个httm服务器,用浏览器访问。

基本原理:

       1.http服务器其实就是一个socket的服务器程序

       2.浏览器其实就是一个socket的客服端程序

       3.它们按照http协议进行传输

我们可以用网络调试助手验证:

        1.用网络助手创建一个192.168.0.105  :8888的TCP服务器

        2.用浏览器访问服务器http://192.168.0.105:8888

        3.ip根据自己电脑的网段设置

可以看到调试助手接收到如下数据(可以确定浏览器访问服务器时发送的是这些内容):

GET /index.html HTTP/1.1 Accept: text/html, application/xhtml+xml, image/jxr, */* Accept-Language: zh-CN User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko Accept-Encoding: gzip, deflate Host: 192.168.0.105:8888 Connection: Keep-Alive

比较有用的是第一行的内容:

GET /index.html HTTP/1.1

     这里给了一些有用的信息,可以看出用的是get请求,后面是要访问的页面。因为是例子我把这个写成index.html

如果是嵌入式的页面可能是LED.html,SET.html等等

     由这个信息,可以知道浏览器要访问index.html页面,我们在程序中需要把这个内容解析出来,然后打开对应的

html文件,这里有人会问html是文件,嵌入式设备没有文件系统怎么办?那么其实是可以用数组把页面保存起来的,

只需要发送数组即可。

首先给浏览器发送http协议头:

//http协议头     char *http_res_hdr_tmpl =      "HTTP/1.1 200 OK\r\nServer: Huiyong's Server <0.1>\r\n"     "Accept-Ranges: bytes\r\nContent-Length: %d\r\nConnection: close\r\n"     "Content-Type: %s\r\n\r\n";

后面发送html文件内容就ok了,浏览器就可以显示你发送过去的页面了。

主函数源码:

while(1) { //客服端连接,这里会无限等待 acpt_soc=accept(srv_soc,(struct sockaddr*)&client_addr,&client_len); printf("[http-Web] client IP:[%s], port:[%d]\n",inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port)); //接收服务器发送过来的http报文,这里会无限等待 recv_len=recv(acpt_soc,recv_buf,1024,0); recv_buf[recv_len]=0; printf("浏览器发送:\n"); printf("%s",recv_buf); /* 向客户端发送响应数据 */ http_send_response(acpt_soc, recv_buf, recv_len); closesocket(acpt_soc); }

程序流程:

        1.等待连接客服端

        2.接收客服端数据

        3.解析http数据

        4.发送http头+html文件

        5.关闭客服端

整个执行就是如此不停的循环。浏览器可以不断的访问这个服务器。

浏览器访问:http://127.0.0.1/index.html

源码:https://download.csdn.net/download/hes_c/10690171

工程是Windows下用VS写的,用linux写其实更简单。

下面会使用get和post命令交换数据,达到与硬件设备通讯的目的。

 

转载请注明原文地址: https://www.6miu.com/read-4260773.html

最新回复(0)