`
yidongkaifa
  • 浏览: 4050272 次
文章分类
社区版块
存档分类
最新评论

LwIP(V1.0.0) RAW API函数源码分析1----tcp_new()函数

 
阅读更多

位于:lwip/src/core/tcp.c

原型:struct tcp_pcb *tcp_new(void)

功能:常见一个TCP协议控制块但并不把它放到任何TCP PCB列表,直到使用tcp_bind()函数绑定.

代码:

/**
 * Creates a new TCP protocol control block but doesn't place it on
 * any of the TCP PCB lists.
 * The pcb is not put on any list until binding using tcp_bind().
 *
 * @internal: Maybe there should be a idle TCP PCB list where these
 * PCBs are put on. Port reservation using tcp_bind() is implemented but
 * allocated pcbs that are not bound can't be killed automatically if wanting
 * to allocate a pcb with higher prio (@see tcp_kill_prio())
 *
 * @return a new tcp_pcb that initially is in state CLOSED
 */
struct tcp_pcb *
tcp_new(void)
{
  return tcp_alloc(TCP_PRIO_NORMAL);	//分配一个新的tcp_pcb结构,正常优先级
}

分析:

1. TCP_PRIO_NORMAL:新pcb的优先级

在tcp.h中有以下定义:

#define TCP_PRIO_MIN1

#define TCP_PRIO_NORMAL 64

#define TCP_PRIO_MAX127

2.tcp_alloc函数:分配一个新的tcp_pcb结构.

该函数源代码:

/**
 * Allocate a new tcp_pcb structure.
 *
 * @param prio priority for the new pcb
 * @return a new tcp_pcb that initially is in state CLOSED
 */
struct tcp_pcb *
tcp_alloc(u8_t prio)
{
  struct tcp_pcb *pcb;
  u32_t iss;

  pcb = memp_malloc(MEMP_TCP_PCB);	//申请内存
  if (pcb == NULL) {		//没能成功分配内存
    /* Try killing oldest connection in TIME-WAIT. */
    LWIP_DEBUGF(TCP_DEBUG, ("tcp_alloc: killing off oldest TIME-WAIT connection/n"));
    tcp_kill_timewait();		//尝试结束最老的连接
    /* Try to allocate a tcp_pcb again. */
    pcb = memp_malloc(MEMP_TCP_PCB);	//再次尝试分配一个tcp_pcb
    if (pcb == NULL) {
      /* Try killing active connections with lower priority than the new one. */
      tcp_kill_prio(prio);//尝试结束一个活动的但优先级低于要申请的tcp_pcb连接
      /* Try to allocate a tcp_pcb again. */
      pcb = memp_malloc(MEMP_TCP_PCB);
    }
  }
  if (pcb != NULL) {	//如果申请到一个pcb
    memset(pcb, 0, sizeof(struct tcp_pcb));	//将分配到的内存块设置成0
    pcb->prio = TCP_PRIO_NORMAL;
    pcb->snd_buf = TCP_SND_BUF;	//用于发送的有效数据缓冲区大小(单位:字节)
				// TCP_SND_BUF在opt.h中定义,默认256
    pcb->snd_queuelen = 0;	//用于发送的有效数据缓冲区空间大小(单位:tep_segs)
    pcb->rcv_wnd = TCP_WND;	//接收器窗口由rcv_wnd字段保存并且字段值是在将要发送的TCP段中获取的
				// TCP_WND在opt.h中定义,默认2048
    pcb->rcv_ann_wnd = TCP_WND;	//宣称的接收窗口
    pcb->tos = 0;		//服务类型
    pcb->ttl = TCP_TTL;		//生存时间
				//TCP_TTL在opt.h中定义,默认255
    /* The send MSS(发送段的最大容量) is updated when an MSS option is received. */
    pcb->mss = (TCP_MSS > 536) ? 536 : TCP_MSS; // TCP_MSS在opt.h中定义,默认128,是一个非常保守的默认值.
    pcb->rto = 3000 / TCP_SLOW_INTERVAL;	//超时重传时间
					// TCP_SLOW_INTERVAL在tcp.h中定义,默认值是500
    pcb->sa = 0;			//平均往返时间
    pcb->sv = 3000 / TCP_SLOW_INTERVAL;	//平均时间差
    pcb->rtime = -1;			//重传时间
    pcb->cwnd = 1;			//连接的当前阻塞窗口值
    iss = tcp_next_iss();  		//为新连接计算一个初始序号,最初值为6510
    pcb->snd_wl2 = iss;
    pcb->snd_nxt = iss;			//下一个要发送的序号
    pcb->snd_max = iss;		        //最高发送序号
    pcb->lastack = iss;			//收到的最后一个ACK包的序列号
    pcb->snd_lbb = iss;			//传输队列最后一个字节的顺序编号
    pcb->tmr = tcp_ticks;		//当指定的时间到时,连接应取消

    pcb->polltmr = 0;			//轮询时间

#if LWIP_CALLBACK_API		//在opt.h中定义,为1表示直接使用回调函数
    pcb->recv = tcp_recv_null;	// tcp_recv_null:默认接收回调函数
#endif /* LWIP_CALLBACK_API */

    /* Init KEEPALIVE timer 初始化持续连接时间*/
    pcb->keep_idle  = TCP_KEEPIDLE_DEFAULT;	//默认两小时,定义在tcp.h中

#if LWIP_TCP_KEEPALIVE	//在opt.h中定义,默认为0
    pcb->keep_intvl = TCP_KEEPINTVL_DEFAULT;
    pcb->keep_cnt   = TCP_KEEPCNT_DEFAULT;
#endif /* LWIP_TCP_KEEPALIVE */

    pcb->keep_cnt_sent = 0;		// KEEPALIVE计数器
  }
  return pcb;
}

总结一下, tcp_alloc函数通过动态申请一块内存并初始化它,之后将这块内存的首地址返回给tcp_new()函数.
分享到:
评论

相关推荐

    在Coursera学习机器学习课程时,自己用python从原理上实现的各种机器学习基础内容.zip

    机器学习是一种人工智能(AI)的子领域,致力于研究如何利用数据和算法让计算机系统具备学习能力,从而能够自动地完成特定任务或者改进自身性能。机器学习的核心思想是让计算机系统通过学习数据中的模式和规律来实现目标,而不需要显式地编程。 机器学习应用非常广泛,包括但不限于以下领域: 图像识别和计算机视觉: 机器学习在图像识别、目标检测、人脸识别、图像分割等方面有着广泛的应用。例如,通过深度学习技术,可以训练神经网络来识别图像中的对象、人脸或者场景,用于智能监控、自动驾驶、医学影像分析等领域。 自然语言处理: 机器学习在自然语言处理领域有着重要的应用,包括文本分类、情感分析、机器翻译、语音识别等。例如,通过深度学习模型,可以训练神经网络来理解和生成自然语言,用于智能客服、智能助手、机器翻译等场景。 推荐系统: 推荐系统利用机器学习算法分析用户的行为和偏好,为用户推荐个性化的产品或服务。例如,电商网站可以利用机器学习算法分析用户的购买历史和浏览行为,向用户推荐感兴趣的商品。 预测和预测分析: 机器学习可以用于预测未来事件的发生概率或者趋势。例如,金融领域可以利用机器学习算法进行股票价格预测、信用评分、欺诈检测等。 医疗诊断和生物信息学: 机器学习在医疗诊断、药物研发、基因组学等领域有着重要的应用。例如,可以利用机器学习算法分析医学影像数据进行疾病诊断,或者利用机器学习算法分析基因数据进行疾病风险预测。 智能交通和物联网: 机器学习可以应用于智能交通系统、智能城市管理和物联网等领域。例如,可以利用机器学习算法分析交通数据优化交通流量,或者利用机器学习算法分析传感器数据监测设备状态。 以上仅是机器学习应用的一部分,随着机器学习技术的不断发展和应用场景的不断拓展,机器学习在各个领域都有着重要的应用价值,并且正在改变我们的生活和工作方式。

    管理系统源码+系统主要分员工管理员两个角色+管理模块具体有商品管理

    系统主要分员工管理员两个角色 管理模块具体有商品管理,部门员工管理,进货管理,订单管理,换货管理,供应商管理,供应商管理,客户管理,公告通知管理等模块,而员工模块具体由商品管理,进货管理,订单管理,供应商管理,客户管理,换货订单管理,公告通知管理等模块组成。 仓库管理信息系统所涉及的主要数据包括商品管理、进货管理、订单管理、换货管理和供应商管理,客户管理,公告通知管理下面分别分析这些数据需求。 (1)商品管理 商品管理主要是管理商品分类信息以及管理商品信息。 (2)进货管理 进货管理主要员工可以登记进货信息,以及查看我的进货记录,而管理员可以添加进货信息以及对进货信息的管理。 (3)订单管理 订单管理主要是对订单的一个统计,员工对销售的订单进行登记,管理员可以管理员工们的订单销售。 (4)换货管理 换货管理主要员工可以登记换货信息,以及查看我的换货记录,而管理员可以添加换货信息以及对换货信息的管理。 (5)供应商管理 管理员可以管理对他们厂家的供应商,来达到可以很好及时的跟供应商进行沟通。 (6)客户管理 管理员可以管理客户。对客户进行维护。

    清新卡通城市建筑大学毕业论文答辩.ppt.zip

    清新卡通城市建筑大学毕业论文答辩.ppt

    5V继电器控制模块原理图+教程.7z

    5V继电器控制模块原理图+教程.7z

    commons-lang-1.0.zip

    commons-lang.jar_服务器端非空校验 各个版本,免费下载 windows版本,linux 版本,免费下载

    水彩清新创意毕业论文答辩模板.pptx.zip

    水彩清新创意毕业论文答辩模板.pptx

    ASP.NET基于BS方式的即时通讯软件的设计与实现(源代码+论文).rar

    计算机毕业设计,含源码

    myudid

    myudid

    新型MNS抽屉柜sw15可编辑设计图纸.7z

    新型MNS抽屉柜sw15可编辑设计图纸.7z

    基于ASP的学生信息档案管理系统毕业论文及源码.zip

    基于ASP的学生信息档案管理系统毕业论文及源码

    小清新文艺田园风毕业论文答辩.ppt.zip

    小清新文艺田园风毕业论文答辩.ppt

    PC控制八路继电器控制板原理图+教程+源代码+下位机源代码+上位机源代码.7z

    PC控制八路继电器控制板原理图+教程+源代码+下位机源代码+上位机源代码.7z

    属性数据分析实验.ipynb

    属性数据分析实验.ipynb

    纸张风格背景【论文答辩PPT模板】.pptx.zip

    纸张风格背景【论文答辩PPT模板】.pptx

    commons-lang3-3.0-beta-bin.zip

    commons-lang.jar_服务器端非空校验 各个版本,免费下载 windows版本,linux 版本,免费下载

    C++中的数学常用函数及其定义

    C++中的数学常用函数及其定义

    fastjson1.2.8 jar包及其源码下载(附带Gson jar包).rar

    fastjson1.2.8 jar包及其源码下载(附带Gson jar包) 免费下载, fastjson.jar是阿里开发的一款专门用于Java开发的包,可以方便的实现json对象与JavaBean对象的转换,实现JavaBean对象与json字符串的转换,实现json对象与json字符串的转换。

    用于了解基本的机器学习原理及算法,掌握sklearn库中常用的机器学习算法的基本调用方法.zip

    机器学习是一种人工智能(AI)的子领域,致力于研究如何利用数据和算法让计算机系统具备学习能力,从而能够自动地完成特定任务或者改进自身性能。机器学习的核心思想是让计算机系统通过学习数据中的模式和规律来实现目标,而不需要显式地编程。 机器学习应用非常广泛,包括但不限于以下领域: 图像识别和计算机视觉: 机器学习在图像识别、目标检测、人脸识别、图像分割等方面有着广泛的应用。例如,通过深度学习技术,可以训练神经网络来识别图像中的对象、人脸或者场景,用于智能监控、自动驾驶、医学影像分析等领域。 自然语言处理: 机器学习在自然语言处理领域有着重要的应用,包括文本分类、情感分析、机器翻译、语音识别等。例如,通过深度学习模型,可以训练神经网络来理解和生成自然语言,用于智能客服、智能助手、机器翻译等场景。 推荐系统: 推荐系统利用机器学习算法分析用户的行为和偏好,为用户推荐个性化的产品或服务。例如,电商网站可以利用机器学习算法分析用户的购买历史和浏览行为,向用户推荐感兴趣的商品。 预测和预测分析: 机器学习可以用于预测未来事件的发生概率或者趋势。例如,金融领域可以利用机器学习算法进行股票价格预测、信用评分、欺诈检测等。 医疗诊断和生物信息学: 机器学习在医疗诊断、药物研发、基因组学等领域有着重要的应用。例如,可以利用机器学习算法分析医学影像数据进行疾病诊断,或者利用机器学习算法分析基因数据进行疾病风险预测。 智能交通和物联网: 机器学习可以应用于智能交通系统、智能城市管理和物联网等领域。例如,可以利用机器学习算法分析交通数据优化交通流量,或者利用机器学习算法分析传感器数据监测设备状态。 以上仅是机器学习应用的一部分,随着机器学习技术的不断发展和应用场景的不断拓展,机器学习在各个领域都有着重要的应用价值,并且正在改变我们的生活和工作方式。

    一个简单的嵌入式与物联网开发脚本示例,用于控制一个假设的LED灯的开关

    这个脚本模拟了一个嵌入式环境中LED灯的开关控制。在实际应用中,你需要根据你所使用的硬件平台(如Raspberry Pi、Arduino等)和具体的GPIO库来调整代码。此外,你还可能需要集成网络通信功能,以便通过物联网技术(如MQTT、HTTP等)远程控制LED灯。 请注意,这只是一个非常基础的示例,用于演示如何在Python中模拟GPIO操作。在真实项目中,你可能还需要考虑更多的因素,如错误处理、多线程/异步操作、电源管理、安全性等。而且,在嵌入式系统上运行Python代码可能还需要交叉编译或特定的运行环境。

    WOA_注释版.rar

    WOA_注释版

Global site tag (gtag.js) - Google Analytics