当前位置: 首页 > news >正文

织梦备份网站数据ppt课件免费下载的网站

织梦备份网站数据,ppt课件免费下载的网站,hao123网址之家,淄博周村网站建设报价使用 lwIP 协议栈进行 TCP 裸机编程#xff0c;其本质就是编写协议栈指定的各种回调函数。将你的应用逻辑封装成函数#xff0c;注册到协议栈#xff0c;在适当的时候#xff0c;由协议栈自动调用#xff0c;所以称为回调。 注#xff1a;除非特别说明#xff0c;以下内…使用 lwIP 协议栈进行 TCP 裸机编程其本质就是编写协议栈指定的各种回调函数。将你的应用逻辑封装成函数注册到协议栈在适当的时候由协议栈自动调用所以称为回调。 注除非特别说明以下内容针对 lwIP 2.0.0 及以上版本。 向协议栈注册回调函数有专门的接口如下所示 tcp_err(pcb, errf); //注册 TCP 接到 RST 标志或发生错误回调函数 errf tcp_connect(pcb, ipaddr, port, connected); //注册 TCP 建立连接成功回调函数 connecter tcp_accept(pcb, accept); //注册 TCP 处于 LISTEN 状态时监听到有新的连接接入 tcp_recv(pcb, recv); //注册 TCP 接收到数据回调函数 recv tcp_sent(pcb, sent); //注册 TCP 发送数据成功回调函数 sent tcp_poll(pcb, poll, interval); //注册 TCP 周期性执行回调函数 poll本节讲述 accept 函数。 accept 回调函数 在 TCP 控制块中函数指针 accept 指向用户实现的函数当监听到有新的连接接入时由协议栈调用此函数通知用户接受了新的连接或者通知用户内存不足。 函数指针 accept 的类型为 tcp_accept_fn 该类型定义在 tcp.h 中 /** Function prototype for tcp accept callback functions. Called when a new* connection can be accepted on a listening pcb.** param arg Additional argument to pass to the callback function (see tcp_arg())* param newpcb The new connection pcb* param err An error code if there has been an error accepting.* Only return ERR_ABRT if you have called tcp_abort from within the* callback function!*/ typedef err_t (*tcp_accept_fn)(void *arg, struct tcp_pcb *newpcb, err_t err);协议栈通过宏 TCP_EVENT_ACCEPT(lpcb,pcb,arg,err,ret) 调用 lpcb-accept 指向的函数。宏 TCP_EVENT_ACCEPT 定义在 tcp_priv.h 中 #define TCP_EVENT_ACCEPT(lpcb,pcb,arg,err,ret) \do { \if((lpcb)-accept ! NULL) \(ret) (lpcb)-accept((arg),(pcb),(err)); \else (ret) ERR_ARG; \} while (0)以关键字 TCP_EVENT_ACCEPT 搜索源码可以搜索到 2 处使用 TCP_EVENT_ACCEPT(pcb, NULL, pcb-callback_arg, ERR_MEM, err); TCP_EVENT_ACCEPT(pcb-listener, pcb, pcb-callback_arg, ERR_OK, err);1 由 tcp_listen_input 函数调用 处于 LISTEN 状态的 TCP 控制块 如果收到客户端发送的 SYN 同步标志表示一个客户端在请求建立连接了。 lwIP 会为这个新连接申请一个 TCP_PCB 这一过程在 tcp_listen_input 函数中完成的。然而 TCP_PCB 的个数是有限的如果申请失败则会调用错误码为 ERR_MEM 的 accept 回调函数向用户报告内存分配失败。简化后的代码为 static void tcp_listen_input(struct tcp_pcb_listen *pcb) {// 通过一系列检查 没有错误 npcb tcp_alloc(pcb-prio); // 申请新的 TCP_PCB if (npcb NULL) { // 内存错误处理LWIP_DEBUGF(TCP_DEBUG, (tcp_listen_input: could not allocate PCB\n));TCP_EVENT_ACCEPT(pcb, NULL, pcb-callback_arg, ERR_MEM, err);return;}// 申请成功初始化新申请的pcbnpcb-state SYN_RCVD;// 发送 ACK|SYN 标志return; }这里需要注意申请 TCP_PCB 失败的处理方法lwIP 2.1.x 版本与 lwIP 1.4.1 不同。 再看看 lwIP 1.4.1 的 tcp_listen_input 函数代码经简化 static err_t tcp_listen_input(struct tcp_pcb_listen *pcb) {// 通过一系列检查 没有错误 npcb tcp_alloc(pcb-prio); // 申请新的 TCP_PCB if (npcb NULL) { // 内存错误处理LWIP_DEBUGF(TCP_DEBUG, (tcp_listen_input: could not allocate PCB\n));return ERR_MEM;}// 申请成功初始化新申请的pcb// 发送 ACK|SYN 标志return ERR_OK; }可以看到 lwIP 1.4.1 版本 tcp_listen_input 函数具有返回值如果申请 TCP_PCB 失败则返回 ERR_MEM 错误码。而 lwIP 2.1.x 版本 tcp_listen_input 函数不具有返回值返回类型为 void 其次lwIP 2.1.x 版本处理内存错误是通过调用 accept 回调函数来实现的。宏展开代码简化后如下所示注意第二个参数为 NULL 错误码为 ERR_MEM if(pcb-accept ! NULL)pcb-accept(pcb-callback_arg, NULL, ERR_MEM);这个功能最早是由 Simon Goldschmidt 在 2016-03-23 提交的提交记录为 tcp: call accept-callback with ERR_MEM when allocating a pcb fails onpassive open to inform the application about this errorATTENTION: applications have to handle NULL pcb in accept callback!tcp在被动打开分配 pcb 失败时使用 ERR_MEM 参数调用 accept 回调函数以通知应用程序有关此错误 注意应用程序必须在 accept 回调中处理 pcb 句柄为 NULL 的情况 这就告诉我们一个重要的信息lwIP 2.1.x 版本的 accept 回调函数编写方式与 lwIP 1.4.1 版本不同。lwIP 2.1.x 版本的 accept 回调函数 必须 在 accept 回调中处理 pcb 句柄为 NULL 的情况举个例子。 lwIP 1.4.1 版本的 accept 回调函数可以这么写 /* 客户端连接时, 回调此函数 */ static err_t telnet_accept(void *arg, struct tcp_pcb *pcb, err_t err) {char * p_link_info 已连接到Telnet!\r\n;tcp_recv(pcb,telnet_recv);tcp_err(pcb,NULL);pcb-so_options | SOF_KEEPALIVE; //增加保活机制tcp_write(pcb, p_link_info, strlen(p_link_info), TCP_WRITE_FLAG_COPY);return ERR_OK; }而 lwIP 2.1.x 版本的accept 回调函数需要这么写 /* 客户端连接时, 回调此函数 */ static err_t telnet_accept(void *arg, struct tcp_pcb *pcb, err_t err) {char * p_link_info 已连接到Telnet!\r\n;if(pcb NULL){if(err ERR_MEM)// 处理 TCP 连接个数不足可选return ERR_OK;}tcp_recv(pcb,telnet_recv);tcp_err(pcb,NULL);pcb-so_options | SOF_KEEPALIVE; //增加保活机制tcp_write(pcb, p_link_info, strlen(p_link_info), TCP_WRITE_FLAG_COPY);return ERR_OK; }这里对 pcb 句柄是否为 NULL 做了处理如果检测到 NULLaccpet 回调函数需要提前退出。 2 由 tcp_process 函数调用 处于 SYN_RCVD 状态的 TCP 控制块如果接收的正确的 ACK 标志则调用错误码为 ERR_OK 的 accept 回调函数向用户报告接受了新的连接。简化后的代码为 static err_t tcp_process(struct tcp_pcb *pcb) {switch (pcb-state) {case SYN_RCVD:if (flags TCP_ACK) {/* expected ACK number? */if (TCP_SEQ_BETWEEN(ackno, pcb-lastack 1, pcb-snd_nxt)) {pcb-state ESTABLISHED;/* Call the accept function. */TCP_EVENT_ACCEPT(pcb-listener, pcb, pcb-callback_arg, ERR_OK, err);if (err ! ERR_OK) {/* If the accept function returns with an error, we abort the connection. */if (err ! ERR_ABRT) {tcp_abort(pcb);}return ERR_ABRT;}tcp_receive(pcb);} }break;}return ERR_OK; }读后有收获资助博主养娃 - 千金难买知识但可以买好多奶粉 (〃‘▽’〃)
http://www.zqtcl.cn/news/641275/

相关文章:

  • 10元网站备案php企业网站开发实训报告
  • 建筑网站设计大全wordpress模板死循环
  • 网站优化排名软件泌阳网站建设
  • 网站反向绑定域名企业网站的建立网络虚拟社区时对于企业
  • 重庆大渡口网站建设解决方案梓潼 网站建设 有限公司
  • 高端平面网站东营住房和城乡建设厅网站
  • 品牌网站建设e小蝌蚪易时代网站
  • 做搜狗手机网站点击软网站建设有哪些种类
  • 想自学做网站太原要做网站的公司
  • 站内seo优化淘宝网站推广策划方案
  • 福建建设执业注册中心网站网址格式怎么写
  • 网站开发外包公司坑襄垣城乡建设管理局的网站
  • 网络公司怎么做网站常州新北区网站建设
  • 扬州专业外贸网站建设推广做详情页上什么网站找素材
  • 北京做网站设计招聘深圳市住房和建设局官网平台
  • 冻品网站建设网站头图设计
  • 手机网站分辨率做多大h5微网站建设多少钱
  • 网站制作软件下载公司怎么注册邮箱帐号
  • 做婚纱网站的图片园林设计
  • 濮阳公司建站淮北城市住建网
  • 建设银行网站打不开 显示停止工作专门做地图的网站
  • 有没有人一起做网站app网站建设方案
  • 洛阳网站建设兼职企业网站建设文案
  • 动漫制作贵州seo策略
  • asp网站建设项目实训该怎么跟程序员谈做网站
  • 网站软件资源iis不能新建网站
  • 网站设计的发展趋势西安市建设工程交易网
  • 做外贸收费的服装网站武钢建设公司网站
  • wordpress 全文搜索企业网站优化策略
  • 犀牛云做网站如何网站备案需要什么东西