LWIP完全剖析详解之core/tcp.c
[cpp]#include "lwip/opt.h" //选项头文件,lwip一些配置的选项包含在opt.h,debug开启和内存大小等配置信息
#if LWIP_TCP /* don't build if not configured for use in lwipopts.h *//*如果在lwipopts.h没有配置LWIP_TCP这项,则不编译TCP这个文件*/
#include "lwip/def.h" //定义项头文件,包括一些宏
#include "lwip/mem.h" //内存头文件,包括一些宏,内存大小,申请内存,内存对齐
#include "lwip/memp.h" //内存池头文件,包含内存申请,内存释放
#include "lwip/snmp.h" //SNMP(Simple Network Management Protocol,简单网络管理协议),包含snmp的函数声明
#include "lwip/tcp.h" //包含tcp.c里面定义的函数声明和所用到的宏
#include "lwip/debug.h" //包含lwip debug的一些宏,开启debug
#include <string.h>
/* Incremented every coarse grained timer shot (typically every 500 ms). */
/* 增加每一个粗粒度的定时器拍摄(通常每500 ms一次)*/
u32_t tcp_ticks; //定义tcp的滴答数
const u8_t tcp_backoff[13] =
{ 1, 2, 3, 4, 5, 6, 7, 7, 7, 7, 7, 7, 7};
/* Times per slowtmr hits */
/* */
const u8_t tcp_persist_backoff[7] = { 3, 6, 12, 24, 48, 96, 120 };
/* The TCP PCB lists. */
/* TCP PCB 列表 */
/** List of all TCP PCBs bound but not yet (connected || listening) */
/** 所有的但是还没有(连接或者监听中的TCP PCB绑定)列表*/
struct tcp_pcb *tcp_bound_pcbs;
/** List of all TCP PCBs in LISTEN state */
/** 所有在监听中的状态 TCP PCB列表*/
union tcp_listen_pcbs_t tcp_listen_pcbs;
/** List of all TCP PCBs that are in a state in which
* they accept or send data. */
/*所有在accept或者send数据状态的TCP PCB列表 */
struct tcp_pcb *tcp_active_pcbs;
/** List of all TCP PCBs in TIME-WAIT state */
/*所有在等待状态中的TCP PCB*/
struct tcp_pcb *tcp_tw_pcbs;
/*所有临时TCP PCB列表*/
struct tcp_pcb *tcp_tmp_pcb;
/*定义tcp计时器*/
static u8_t tcp_timer;
/*生成新的tcp本地端口*/
static u16_t tcp_new_port(void);
/**
* Called periodically to dispatch TCP timers.
*
*/
/*
*定期调用派遣TCP定时器
*/
void
tcp_tmr(void)
{
/* Call tcp_fasttmr() every 250 ms */
/*每250ms调用一次tcp_fasttmr()*/
tcp_fasttmr();
if (++tcp_timer & 1) {//tcp_timer加1后与1
/* Call tcp_tmr() every 500 ms, i.e., every other timer
tcp_tmr() is called. */
/*
每500ms调用一次tcp_tmr(),tcp_tmr被其他的定时器调用
*/
tcp_slowtmr();
}
}
/**
* Closes the connection held by the PCB.
*
* Listening pcbs are freed and may not be referenced any more.
* Connection pcbs are freed if not yet connected and may not be referenced
* any more. If a connection is established (at least SYN received or in
* a closing state), the connection is closed, and put in a closing state.
* The pcb is then automatically freed in tcp_slowtmr(). It is therefore
* unsafe to reference it.
*
* @param pcb the tcp_pcb to close
* @return ERR_OK if connection has been closed
* another err_t if closing failed and pcb is not freed
*/
/*
*通过PCB关闭连接握手
*监听中的pcb应该被释放的,也许永远也不会被使用了
*连接的pcb应该被释放的,如果还没有连接或者再也没有被引用
*如果一个连接被建立(至少SYN已经被接收或者在一个关闭中的状态)
*连接被关闭了,而且输入了一个正在关闭的状态
*pcb然后自动在tcp_slowtmr()释放,所以引用它是不安全的
*/
err_t
tcp_close(struct tcp_pcb *pcb)
{
err_t err;
//TCP debug信息,打印pcb的状态
#if TCP_DEBUG
LWIP_DEBUGF(TCP_DEBUG, ("tcp_close: closing in "));
tcp_debug_print_state(pcb->state);
#endif /* TCP_DEBUG */
switch (pcb->state) {
case CLOSED:
/* Closing a pcb in the CLOSED state might seem erroneous,
* however, it is in this state once allocated and as yet unused
* and the user needs some way to free it should the need arise.
* Calling tcp_close() with a pcb that has already been closed, (i.e. twice)
* or for a pcb that has been used and then entered the CLOSED state
* is erroneous, but this should never happen as the pcb has in those cases
* been freed, and so any remaining handles are bogus. */
/*在CLOSED状态下关闭一个pcb似乎是错误的,
*尽管如此,一但在这个状态下分配了而且还没有使用所以用户需要一些办法来释放它
*调用一个已经被关闭的pcb的tcp_close(),(即2次)或者一个已经被使用了之后,进入CLOSE状态是错误的
*但作为一个在这些情况下被释放的pcb是不会存在的,因此,任何剩余的句柄都是假的
*/
err = ERR_OK;//设定返回值
TCP_RMV(&tcp_bound_pcbs, pcb);//从绑定的pcb列表中去掉pcb
memp_free(MEMP_TCP_PCB, pcb);//在MEMP_TCP_PCB内存池设定释放掉的pcb对应的单元值,释放内存
pcb = NULL; //设置pcb指针指向空
break;
case LISTEN:
err = ERR_OK;//设定返回值
tcp_pcb_remove((struct tcp_pcb **)&tcp_listen_pcbs.pcbs, pcb);//在tcp PCB监听列表中删除对应的pcb
memp_free(MEMP_TCP_PCB_LISTEN, pcb);//在MEMP_TCP_PCB_LISTEN对应的内存池中设定需要释放的pcb单元值
pcb = NULL;//设置pcb指针指向空
break;
case SYN_SENT:
err = ERR_OK;//设定返回值
tcp_pcb_remove(&am
补充:软件开发 , C++ ,
- 更多C/C++疑问解答:
- 关于c++的cout输出的问题。
- 在学校里学过C和C++,不过学的很一般,现在自学C#,会不会很难?
- 全国计算机二级C语言笔试题
- 已知某树有2个2度结点,3个3度结点,4个4度结点,问有几个叶子结点?
- c++数据结构内部排序问题,整数排序
- 2012九月计算机二级C语言全国题库,,急求急求
- 如果assert只有一个字符串作为参数,是什么意思呢?
- C语言中,哪些运算符具有左结合性,哪些具有右结合性,帮忙总结下,谢谢了!
- 为什么用结构体编写的程序输入是,0输不出来啊~~~
- 将IEEE—754的十六进制转化为十进制浮点类型,用C或C++都行,多谢各位大侠啊,非常感谢!
- 为什么这个程序求不出公式?
- 这个链表倒置的算法请大家分析下
- c语言函数库调用
- C语言unsigned int纠错
- C语言快排求解啊