一直想弄一下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命令交换数据,达到与硬件设备通讯的目的。

c语言编写http服务器相关推荐

  1. c语言编写邮件服务器,SMTP邮件服务器实验报告及源代码.docx

    PAGE14 / NUMPAGES14 SMTP邮件服务器实验 1. 实验内容和实验环境描述 实验任务:使用Socket API编写一个SMTP邮件服务器程序 实验内容:1)作为SMTP服务器,接收邮 ...

  2. c语言编写服务器的优点,用C语言编写的服务器中记录效率最高的文件是什么?...

    使用线程通常是一个很好的解决方案,我们通过它有趣的结果. 需要记录的主线程准备日志字符串并将其传递给第二个线程.为了提供第二个线程,我们使用无锁队列+循环内存来尽量减少alloc/free和等待时间. ...

  3. 2022-07-25:xiu是用rust语言编写的流媒体服务器软件项目。k8s安装xiu,drone文件如何写?

    2022-07-25:xiu是用rust语言编写的流媒体服务器软件项目.k8s安装xiu,drone文件如何写? 答案2022-07-25: 云原生环境不可能完全一样,只能做参考. 我采用的是dron ...

  4. 2023-03-05:ffmpeg推送本地视频至lal流媒体服务器(以RTMP为例),请用go语言编写。

    2023-03-05:ffmpeg推送本地视频至lal流媒体服务器(以RTMP为例),请用go语言编写. 答案2023-03-05: 使用 github.com/moonfdd/ffmpeg-go 库 ...

  5. Redox随笔(2)-用Rust语言编写的类UNIX操作系统

    与其他操作系统相比,Redox如何 我们与其他操作系统有很多共同之处. 由于 Redox syscall接口是Unix-y.例如,我们有open, pipe, pipe2, lseek, read, ...

  6. cgic: 为C语言编写CGI的C函数库

    http://www.qqread.com/cgi-perl/v223877.html cgic: 为c语言编写CGI的C函数库 由Thomas Boutell开发 目录 CGIC介绍 怎样写CGIC ...

  7. jdbc是java语言编写的类和接口_JDBC——Java语言连接数据库的标准

    JDBC概述 API JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Jav ...

  8. 用Java语言编写的随机彩色验证码

    在制作网页过程中,免不了在登录注册页面增加一个验证码来延长数据提交时间,以免大量用户过快连接数据库读取,写入数据导致服务器崩溃.以下是用Java语言编写的彩色验证码,可用于jsp.html文件. 源代 ...

  9. 组件分享之后端组件——基于Golang语言的游戏服务器框架leaf

    组件分享之后端组件--基于Golang语言的游戏服务器框架leaf 背景 近期正在探索前端.后端.系统端各类常用组件与工具,对其一些常见的组件进行再次整理一下,形成标准化组件专题,后续该专题将包含各类 ...

最新文章

  1. python三种数据类型详解_最全面的Python数据类型知识点讲解
  2. 【精华总结】全文4000字、20个案例详解Pandas当中的数据统计分析与排序
  3. SAP Spartacus visible-focus是如何施加到HTML element上的
  4. Ngui之UI框架的层级处理
  5. 五年后的4.20地震
  6. Sublime Text 3 注册码
  7. 一个网卡配置两个不同网段的IP地址(比如应用道闸项目)
  8. 自建服务器同步软件,自建Syncthing中继服务器(私密传输或造福大众)
  9. android系统中如何通过程序打开某个AccessibilityService
  10. vue http get html模板,怎么用vue.js做异步请求?
  11. showModalDialog和showModelessDialog中提交form不弹出新窗口
  12. appscan 历史版本下载
  13. mac电脑怎么配置adb环境变量
  14. CodeMeter:软件加密的“木桶定律”
  15. VisualStudio2010编译出错fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏 的解决方法
  16. 论文翻译器:pdf 英文论文一键转换成中英文对照的文档
  17. 室内地图导航shopcloud
  18. 【VESC】一.配置开发环境、烧录固件
  19. 【数值分析】Jacobi、Seidel和Sor迭代法求解线性方程组(附matlab代码)
  20. Android使用字体代替图标

热门文章

  1. SkyWalking showcase部署报错“sh“: executable file not found in $PATH: unknown.
  2. wireshark捕获IP分片数据包实践
  3. 使内部窗体靠右悬停java_java如何把窗体嵌入桌面底层,即使是桌面图标也在它的上面?...
  4. foreach循环的介绍
  5. 【项目分析】网络嗅探器
  6. SQLServer入门基础(SQL语句)
  7. 【SQL基础-2】SQL常用运算符及通配符
  8. 使用JS更改CSS样式
  9. 向google申请白名单
  10. jira使用网络钩子功能进行短信发送