今日无聊内容,配合卡农食用。
网页控制设备:在开发板上运行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()函数,内部产生的一系列活动。
(哎,今日排版略垃圾,慢慢改进吧)
(*╹▽╹*)如果你也正好无聊,可以考虑关注一波~
领取专属 10元无门槛券
私享最新 技术干货