每日生存大作战(一)

今日无聊内容,配合卡农食用。

网页控制设备:在开发板上运行HTTP服务器程序,用户通过浏览器连接到服务器,通过浏览器设置开发板上的LED灯亮灭。

网页服务器主任务httpserver_thread()

netconn_new()--新建TCP连接结构conn

netconn_bind()--绑定HTTP的熟知端口80号端口

netconn_listen()--服务器侦听

循环:

netconn_accept()--接受来自客户端的新连接newconn

新连接创建成功

httpserver_serve()--自己编写的部分,用于处理这个连接上的数据请求

netconn_delete()--处理完毕,删除该连接

netconn_close()--关闭连接结构conn

netconn_delete()--删除连接结构conn

2.上述的httpserver_serve()

netconn_recv()--接收客户端数据

判断成功接收与否

成功接收

如果是“GET”请求,调用httpserver_send_html()以响应;

如果是POST请求,判断是打开LED还是关闭LED,然后调用httpserver_send_html()以响应;

删除接收的数据包

netconn_close()--关闭本地连接

3.上述的httpserver_send_html()

此函数用于向所连接的客户端返回html数据

先发送html头部数据,再发送LED开或关,使用netconn_write()

4.完成上述应用程序,需要使用操作系统模拟层自己编写的sys_thread_new()函数将上述步骤1中的httpserver_thread()注册为ucos-II中的一个进程。sys_thread_new()函数中使用OSTaskCreate()函数调用来注册进程。

以上,netconn_xxx函数均为LwIP内核提供的API接口函数,这种方法比直接使用RAW/Callback API编程需要的系统开销和资源更多,且需要OS的支持,还有更高级别的BSD socket接口,BSD实现更高级别的抽象,能够使用户像使用文件一样操作一个网络连接;sequential API的抽象级别较低,用户操作的是网络连接,不是文件。

内核提供给一部分编程接口给用户使用,这些函数在用户进程中执行;另一部分则驻留在协议栈内核进程中。这两部分通过进程通信机制(IPC)进行通信和同步。

当一个用户程序使用netconn_xxx API的时候,发生的事情:

(1)API调用

netconn_xxx()中发生的事情:

(2)构造消息api_msg

(3)构造消息tcpip_msg

(4)投递消息tcpip_msg到邮箱mbox

(5)等待信号量

内核进程:

(6)从mbox中获得消息

(7)解析消息,经过解析后,知道调用对应的do_xxx()函数

(8)do_xxx()调用内核中的tcp_xxx()或者udp_xxx()函数

(9)释放信号量

这个时候在等待信号量的用户进程:

(10)获得信号量

这就是用户使用一次netconn_xxx()函数,内部产生的一系列活动。

(哎,今日排版略垃圾,慢慢改进吧)

(*╹▽╹*)如果你也正好无聊,可以考虑关注一波~

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180722G1GY0Z00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券