1.前言

lwIP的内核并不是线程安全的。如果我们必须在多线程环境里使用lwIP,那么我们必须使用“upper”API层的函数(netconn或sockets)。当使用raw API时,你需要自己保护你的内核。

2.并发处理

(1)Sockets通常来说并不能在多个应用线程中使用(在udp/raw netconn,sendto/recv可以实现)。

(2)一些上层操作的并发调用必须被应用层直接处理,如:socket,bind,connect,setsockopt和close。

有些情况必须要lwIP来处理(比如,要知道一个’int socket’的调用在close/socket之间是否都相同是困难的):如下所示

Task1
int s1=socket() (tell s1=)
Task1,Task2
use s1 with send,recv (ok, it could be possible).
Task2
closesocket(s1)
Task3
int s2=socket() (and... it could be s2=)
Task1
send(s1) !!!! Problem, s1 would not the same proto/port than the first we open,
!!!! but only application can know that !!!!

(3)一些操作(recv,recvfrom,send,sendto…)可以变为线程安全。为了使能全双工协议,我们必须将netconn/sockets的一些处理放到api_msg

(4)一些其它需要了解的信息

  • 一些特别的函数(netif_xxx和dhcp_xxx)在多线程中可能导致问题。这些函数在tcpip_thread使用相同的变量

(5)一些举例

  • 如果一个应用线程删除了一个netif,但tcpip_thread还在运行,这个会导致一个崩溃。在同一个时间内加入2个netif将会导致接口的丢失,详情请查看https://savannah.nongnu.org/bugs/?19347
  • 如果有一个应用线程停止了一个接口的dhcp,由于netif’s dhcp字段被dhcp’s定时器使用(在tcpip_thread线程运行),你将导致一个崩溃,详情请查看https://savannah.nongnu.org/patch/?5798

为了避免先前2个问题,你可以使用”netif api”,该api非常接近于‘netif’和‘dhcp’API

LwIP Application Developers Manual9---LwIP and multithreading的更多相关文章

  1. LwIP Application Developers Manual8---Sample lwIP applications

    1.前言 你已经编译lwIP协议栈在你的目标平台上,并且网络驱动正常工作.你可以ping你的设备. 干得好,为你感到骄傲.虽然一个设备可以响应ping,但并不能算一个完整的应用. 现在你可以通过网络接 ...

  2. LwIP Application Developers Manual12---Configuring lwIP

    1.前言 2.LwIP makefiles With minimal features C_SOURCES = \ src/api/err.c \ src/core/init.c \ src/core ...

  3. LwIP Application Developers Manual11---Initializing lwIP

    1.前言 2.Initialization for simple lwIP 查看doc/rawapi.txt来获得更多官方信息 #if NO_SYS /* Network interface vari ...

  4. LwIP Application Developers Manual2---Protocols概览

    1.前言 本文是对LwIP Application Developers Manual的翻译 lwIP是模块化的并支持广泛的协议,这些大部分协议可以被裁减从而减小代码的尺寸 2.协议概览 链路层和网络 ...

  5. LwIP Application Developers Manual1---介绍

    1.前言 本文主要是对LwIP Application Developers Manual的翻译 2.读者(应用开发手册的读者) 谁适合读这份手册 网络应用的开发者 想了解lwIP的网络应用开发者 阅 ...

  6. LwIP Application Developers Manual5---高层协议之DNS

    1.前言 lwIP提供一个基本的DNS客户端(1.3.0后引进),通过使用DNS(Domain Name System)协议来允许应用程序解决主机名到地址的转换. 在文件lwipopts.h里面定义L ...

  7. LwIP Application Developers Manual5---高层协议之DHCP,AUTOIP,SNMP,PPP

    1.前言 本文主要讲述高层协议,包括DHCP 2.DHCP 2.1 从应用的角度看DHCP 你必须确保在编译和链接时使能DHCP,可通过在文件lwipopts.h里面定义LWIP_DHCP选项,该选项 ...

  8. LwIP Application Developers Manual4---传输层之UDP、TCP

    1.前言 本文主要讲解传输层协议UDP TCP 2.UDP 2.1 UDP from an application perspective 2.2 UDP support history in lwI ...

  9. LwIP Application Developers Manual3---链路层和网络层协议之IPV6,ICMP,IGMP

    1.前言 本文主要讲述链路层和网络层的协议IPV6,ICMP 2.IPV6 2.1 IPV6特性 IPv6是IPv4的更新.其最显著的差别在于地址空间由32位转换成128位 2.2 从应用的角度看IP ...

随机推荐

  1. .gitignore无效的原因

    有时候,我们编写gitinore后发现文件还是没有被忽略,这是什么原因呢? 熟知git的老鸟们可能已经知道,因为这个文件在之前已经被追踪了,如果想忽略已经被追踪的文件我们需要把这个追踪去除. 对所有文 ...

  2. Hadoop HDFS常用操作命令

    hadoop常用命令:hadoop fs查看Hadoop HDFS支持的所有命令 hadoop fs –ls列出目录及文件信息 hadoop fs –lsr循环列出目录.子目录及文件信息 hadoop ...

  3. ActiveMQ详细入门使用教程

    ActiveMQ介绍 MQ是消息中间件,是一种在分布式系统中应用程序借以传递消息的媒介,常用的有ActiveMQ,RabbitMQ,kafka.ActiveMQ是Apache下的开源项目,完全支持JM ...

  4. java动态获取上传文件的编码类型

    package com.sjfl.main; import java.io.BufferedReader; import java.io.File; import java.io.FileInputS ...

  5. CrawlSpiders模块的使用

    创建文件模板 scrapy genspider -t crawl tencent tencent.com CrawlSpiders就是为爬取整站孕育而生的,我们以前是分页下一页,然后再yied.这样太 ...

  6. Django之组件--cookie与session

    cookie组件 cookie:由服务器产生,存放在客户端浏览器上的键值对. 使用: -设置值: obj=HttpResponse('ok') obj.set_cookie('key','value' ...

  7. appcms SSRF 绕过漏洞[转载]

    漏洞 <?php if(isset($_GET['url']) && trim($_GET['url']) != '' && isset($_GET['type' ...

  8. IntelliJ IDEA 2017 配置Tomcat 运行Web项目

    以前都用MyEclipse写程序的 突然用了IDEA各种不习惯的说 借鉴了很多网上好的配置办法,感谢各位大神~ 前期准备 IDEA.JDK.Tomcat请先在自己电脑上装好 好么~ 博客图片为主 请多 ...

  9. 09、 在QQ音乐中查找七里香这首歌的精彩评论

       找到七里香这首歌的精彩评论      URL https://c.y.qq.com/base/fcgi-bin/fcg_global_comment_h5.fcg?g_tk=5381&l ...

  10. Node.js学习入门

    Node.js是什么 Node.js是一个可以允许我们在服务器端运行JavaScript代码的程序. 这是什么意思呢?通常,我们写的JavaScript代码都是在浏览器中运行的. 实际上,浏览器就是一 ...