温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

lwip中TCP和UDP的API有哪些

发布时间:2021-12-30 09:18:02 来源:亿速云 阅读:142 作者:小新 栏目:互联网科技

这篇文章给大家分享的是有关lwip中TCP和UDP的API有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

01、TCP相关API

1、tcp_arg()

该函数用于传递给应用程序的具体状态,在控制块标志建立以后调用,即在函数tcp_new()调用之后才能调用

功能

指定应该传递给所有回调函数的应用程序的具体状态

原型

void tcp_arg(struct tcp_pcb *pcb, void *arg)

参数

pcb:当前TCP连接的控制块

arg: 需要传递给回调函数的参数

返回

2tcp_new()

该函数在定义一个tcp_pcb控制块后应该首先被调用,以建立该控制块的连接标志

功能

建立一个新的连接标志(pcb)

原型

struct tcp_pcb *tcp_new(void)

参数

返回

pcb: 正常建立了连接标志,返回建立的pcb

NULL:新的pcb内存不可用时

3tcp_bind()

该函数用户绑定本地的IP地址和端口号,用户可以将其绑定在一个任意的本地IP地址上,它也只能在函数tcp_new()调用之后才能调用

功能

绑定本地IP地址和端口号

原型

err_t tcp_bind (struct tcp_pcb *pcb, struct ip_addr *ipaddr, u16_t port)

参数

pcb: 准备绑定的连接,类似于BSD标准中的Sockets

ipaddr:绑定的IP地址。如果为IP_ADDR_ANY,则将连接绑定到所有的本地IP地址上

port: 绑定的本地端口号。注意:千万不要和其它的应用程序产生冲突

返回

ERR_OK:正确地绑定了指定的连接

ERR_USE: 指定的端口号已经绑定了一个连接,产生了冲突

4tcp_listen()

当一个正在请求的连接被接收时,由tcp_accept()函数指定的回调函数将会被调用。当然,在调用本函数前,必须首先调用函数tcp_bind()来绑定一个本地的IP地址和端口号

功能

使指定的连接开始进入监听状态

原型

struct tcp_pcb *tcp_listen (struct tcp_pcb *pcb)

参数

pcb:指定将要进入监听状态的连接

返回

pcb: 返回一个新的连接标志pcb,它作为一个参数传递给将要被分派的函数。这样做的原

因是处于监听状态的连接一般只需要较小的内存,于是函数tcp_listen()就会收回原始连接

的内存,而重新分配一个较小内存块供处于监听状态的连接使用。

NULL: 监听状态的连接的内存块不可用时,返回NULL。如果这样的话,作为参数传递给

函数tcp_listen()的pcb所占用的内存将不能够被分配。

5、tcp_listen_with_backlog()

该函数同tcp_listen()一样,但是该函数将限制在监听队列中未处理的连接的数量,这是通过参数backlog来实现的。要使用该函数,需要在配置文件lwipopts.h中设置TCP_LISTEN_BACKLOG=1。

功能

使指定的连接开始进入监听状态,但将会限制监听队列中连接的数量

原型

struct tcp_pcb *tcp_listen_with_backlog(struct tcp_pcb *pcb, u8_t backlog)

参数

pcb: 指定将要进入监听状态的连接

backlog: 限制监听队列中连接的数量

返回

pcb: 返回一个新的连接标志pcb,它作为一个参数传递给将要被分派的函数。这样做的原

因是处于监听状态的连接一般只需要较小的内存,于是函数tcp_listen()就会收回原始

连接的内存,而重新分配一个较小内存块供处于监听状态的连接使用。

NULL: 监听状态的连接的内存块不可用时,返回NULL。如果这样的话,作为参数传递

给函数tcp_listen()的pcb所占用的内存将不能够被分配。

6tcp_accepted()

这个函数通常在“accept”的回调函数中被调用。它允许LwIP去执行一些内务工作,例如,将新来的连接放入到监听队列中,以等待处理。

功能

通知LwIP一个新来的连接已经被接收

原型

void tcp_accepted(struct tcp_pcb *pcb)

参数

pcb: 已经被接收的连接

返回

7tcp_accept()

当处于监听的连接与一个新来的连接连接上后,该函数指定的回调函数将被调用。通常在tcp_listen()函数调用之后调用。

功能

指定处于监听状态的连接接通后将要调用的回调函数

原型

void tcp_accept(struct tcp_pcb *pcb,

err_t (* accept)(void *arg,

struct tcp_pcb *newpcb,

err_t err))

参数

pcb:指定一个处于监听状态的连接

accept:指定连接接通后将要调用的回调函数

返回

8tcp_connect()

请求参数pcb指定的连接连接到远程主机,并发送打开连接的最初的SYN段。函数tcp_connect()调用后立即返回,它并不会等待连接一定要正确建立。如果当连接正确建立,那么它会直接调用第四个参数指定的函数(connected参数)。相反地,如果连接不能够被正确建立,这原因可能是远程主机拒绝连接,也可能是远程主机不应答,无论是什么原因,都会调用connected函数来设置相应的参数err

功能

请求指定的连接连接到远程主机,并发送打开连接的最初的SYN段

原型

err_t tcp_connect(struct tcp_pcb *pcb,

struct ip_addr *ipaddr,

u16_t port,

err_t (* connected)(void *arg,

struct tcp_pcb *tpcb,

err_t err))

参数

pcb:指定一个连接(pcb)

ipaddr: 指定连接远程主机的IP地址

port: 指定连接远程主机的端口号

connected:指定连接正确建立后调用的回调函数

返回

ERR_MEM:当访问SYN段的内存不可用时,即连接没有成功建立

ERR_OK: 当SYN被正确地访问时,即连接成功建立

9tcp_write()

该函数功能是发送TCP数据,但是并不是一经调用,就立即发送数据,而是将指定的数据放入到发送队列,由协议内核来决定发送。发送队列中可用字节的大小可以通过函数tcp_sndbuf()来重新获得。使用这个函数的一个比较恰当的方法是以函数tcp_sndbuf()返回的字节大小来发送数据。如果函数返回ERR_MEM,则应用程序就等待一会,直到当前发送队列中的数据被远程主机成功地接收,然后在尝试发送下一个数据

功能

发送TCP数据

原型

err_t tcp_write(struct tcp_pcb *pcb,

void *dataptr,

u16_t len,

u8_t copy)

参数

pcb:指定所要发送的连接(pcb)

dataptr:是一个指针,它指向准备发送的数据

len: 指定要发送数据的长度

copy: 这是一个逻辑变量,它为0或者1,它指定是否分配新的内存空间,而把要发送的数

据复制进去。如果该参数为0,则不会为发送的数据分配新的内存空间,因而对发送

数据的访问只能通过指定的指针

返回

ERR_MEM:如果数据的长度超过了当前发送数据缓冲区的大小或者将要发送的段队列的

长度超过了文件lwipopts.h中定义的上限(即最大值),则函数tcp_write()调用失

败,返回ERR_MEM

ERR_OK:数据被正确地放入到发送队列中,返回ERR_OK

10tcp_sent()

该函数用于设定远程主机成功接收到数据后调用的回调函数,通常也在函数tcp_listen()之后调用。

功能

指定当远程主机成功地接收到数据后,应用程序调用的回调函数

原型

void tcp_sent(struct tcp_pcb *pcb,

err_t (* sent)(void *arg,

struct tcp_pcb *tpcb,

u16_t len))

参数

pcb: 指定一个与远程主机相连接的连接(pcb)

sent: 指定远程主机成功地接收到数据后调用的回调函数。“len”作为参数传递给回调函数,

给出上一次已经被确认的发送的最大字节数。

返回

11tcp_recv()

该函数用于指定当有新的数据接收到时调用的回调函数,通常在函数tcp_accept()指定的回调函数中调用。

功能

指定当新的数据接收到时调用的回调函数

原型

void tcp_recv (struct tcp_pcb *pcb,

err_t (* recv)(void *arg,

struct tcp_pcb *tpcb,

struct pbuf *p,

err_t err))

参数

pcb: 指定一个与远程主机相连接的连接(pcb)

recv: 指定当新的数据接收到时调用的回调函数。该回调函数可以通过传递一个NULL的

pbuf结构用来指示远程主机已经关闭连接。如果没有错误发生,则回调函数返回

ERR_OK,并且必须释放掉pbuf结构。否则,如果函数的调用中发生错误,那么千

万不要释放该结构,以便LwIP内核可以保存该结构,从而等待以后处理。

返回

12tcp_recved()

当应用程序接收到数据的时候该函数必须被调用,用于获取接收到的数据的长度,即该函数应该在函数tcp_recv()指定的回调函数中调用。

功能

获取接收到的数据的长度

原型

void tcp_recved(struct tcp_pcb *pcb, u16_t len)

参数

pcb: 指定一个与远程主机相连接的连接(pcb)

len:获取接收到的数据的长度

返回

13tcp_poll()

当使用LwIP的轮询功能时必须调用该函数,用于指定轮询的时间间隔及轮询时应该调用的回调函数

功能

指定轮询的时间间隔以及轮询应用程序时应该调用的回调函数

原型

void tcp_poll(struct tcp_pcb *pcb,

err_t (* poll)(void *arg, struct tcp_pcb *tpcb),

u8_t interval)

参数

pcb:指定一个连接(pcb)

poll: 指定轮询应用程序时应该调用的回调函数

interval:指定轮询的时间间隔。时间间隔应该以TCP的细粒度定时器为单位,典型的设置

是每秒钟两次。把参数“interval”设置为10意味着应用程序将每5秒钟轮询一次。

返回

14tcp_close()

功能

关闭一个指定的TCP连接,调用该函数后,TCP代码将会释放(删除)pcb结构

原型

err_t tcp_close(struct tcp_pcb *pcb)

参数

pcb: 指定一个需要关闭的连接(pcb)

返回

ERR_MEM:当需要关闭的连接没有可用的内存时,该函数返回ERR_MEM。如果这样的

话,应用程序将通过事先确立的回调函数或者是轮询功能来等待及重新关闭连接

ERR_OK:连接正常关闭。

15tcp_abort()

该函数通过向远程主机发送一个RST(复位)段来中止连接。pcb结构将会被释放。该函数是不会失败的,它一定能完成中止的目的。如果连接是因为一个错误而产生了中止,则应用程序会通过回调函数灵敏地处理这个事件。通常发送错误而引起的连接中止都是因为内存资源短缺引起的。设置处理错误的回调函数是通过函数tcp_err()来完成。

功能

中止一个指定的连接(pcb)

原型

void tcp_abort(struct tcp_pcb *pcb)

参数

pcb: 指定一个需要关闭的连接(pcb)

返回

16tcp_err()

该函数用于指定处理错误的回调函数。一个可靠的优秀的应用程序一般都要处理可能出现的错误,如内存不可用等,这就需要调用该函数来指定一个回调函数来获取错误信息

功能

指定处理错误的回调函数

原型

void tcp_err(struct tcp_pcb *pcb,

void (* err)(void *arg, err_t err))

参数

pcb: 指定需要处理的发送错误的连接(pcb)

err: 指定发送错误时调用的回调函数。因为pcb结构可能已经被删除了,所以在处理错误

的回调函数中pcb参数不可能传递进来。

返回

02、UDP相关API

 1udp_new()

该函数用于建立一个用于UDP通信的UDP控制块(pcb),但是这个pcb并没有被激活,除非该pcb已经被绑定到一个本地地址上或者连接到一个固定地址的远程主机。在定义一个udp_pcb控制块后该函数应该首先被调用,以建立该控制块的连接标志

功能

建立一个用于UDP通信的UDP控制块(pcb)

原型

struct udp_pcb *udp_new(void)

参数

返回

udp_pcb:建立的UDP连接的控制块(pcb)

2udp_remove()

该函数用于删除一个指定的连接,通常是控制块在建立成功后,即在函数udp_new()调用之后,当不需要该网络连接来通信了,就需要将其删除,以释放该连接(pcb)所占用的资源。

功能

删除并释放掉一个udp_pcb

原型

void udp_remove(struct udp_pcb *pcb)

参数

pcb:指定要删除的连接(pcb)

返回

3udp_bind()

该函数用户绑定本地的IP地址和端口号,用户可以将其绑定在一个任意的本地IP地址上,它也只能在函数udp_new()调用之后才能调用

功能

为指定的连接绑定本地IP地址和端口号

原型

err_t udp_bind(struct udp_pcb *pcb,

struct ip_addr *ipaddr,

u16_t port)

参数

pcb:指定一个连接(pcb)

ipaddr:绑定的本地IP地址。如果为IP_ADDR_ANY,则将连接绑定到所有的本地IP地址上

port: 绑定的本地端口号。注意:千万不要和其它的应用程序产生冲突

返回

ERR_OK:正确地绑定了指定的连接

ERR_USE: 指定的端口号已经绑定了一个连接,产生了冲突

4udp_connect()

该函数将一个指定的连接(pcb)连接到远程主机。由于UDP通信是面向无连接的,所以这不会参数任何的网络流量(网络数据收发),它仅仅是设置了一个远程连接的IP地址和端口号。

功能

将参数“pcb”指定的连接控制块连接到远程主机

原型

err_t udp_connect(struct udp_pcb *pcb,

struct ip_addr *ipaddr,

u16_t port)

参数

pcb:指定一个连接(pcb)

ipaddr:设置连接的远程主机IP地址

port: 设置连接的远程主机端口号

返回

ERR_OK:正确连接到远程主机

其它值: LwIP的一些错误代码标志,表示连接没有正确建立

5udp_disconnect()

该函数关闭参数“pcb”指定的连接,同函数udp_connect()作用相反。由于UDP通信是面向无连接的,所以这个函数同样不会参数任何的网络流量((网络数据收发),它仅仅是删除了远程连接的地址

功能

关闭参数“pcb”指定的连接, 同函数udp_connect()作用相反

原型

void udp_disconnect(struct udp_pcb *pcb)

参数

pcb:指定要删除的连接(pcb)

返回

6udp_send()

该函数使用UDP协议发送pbufp指向的数据。在需要发送数据时调用,发送后,该pbuf结构并没有被释放。调用该函数后,数据包将被发送到存放在pcb中的当前指定的IP地址和端口号上。如果该pcb没有连接到一个固定的端口号,那么该函数将会自动随机地分配一个端口号,并将数据包发送出去。通常,在调用前都会先调用函数udp_connect()

功能

使用UDP协议发送pbuf p指向的数据

原型

err_t udp_send(struct udp_pcb *pcb, struct pbuf *p)

参数

pcb:指定发送数据的连接(pcb)

p: 包含需要发送数据的pbuf链

返回

ERR_OK:数据包成功发送,没有任何错误发生

ERR_MEM:内存不可用

ERR_RTE:不能找到到达远程主机的路由

其它值:其它的一些错误码,都表示发送了错误

7udp_sendto()

该函数同udp_send()作用一样,但是它指定了发送的目的主机IP地址和端口号,相当于udp_connect()和函数udp_send()合在一起使用的效果。但是,如果在调用该函数前已经调用过函数udp_connect(),那么发送目的主机的IP地址和端口号将以本函数指定的为准,由函数udp_connect()指定的将会被刷新

功能

向具有指定的IP地址和端口号远程主机发送UDP数据

原型

err_t udp_sendto(struct udp_pcb *pcb,

struct pbuf *p,

struct ip_addr *dst_ip,

u16_t dst_port)

参数

pcb:指定发送数据的连接(pcb)

p: 包含需要发送数据的pbuf链

dst_ip:发送数据的远程主机IP地址

dst_port:发送数据的远程主机端口号

返回

同函数udp_send()的返回值一样

8udp_recv()

该函数用于指定当有新的UDP数据接收到时被调用的回调函数,回调函数将的参数将传递进远程主机的IP地址、端口号及接收到的数据等信息

功能

指定一个接收到UDP数据包时被调用的回调函数

原型

void udp_recv(struct udp_pcb *pcb,

void (* recv)(void *arg,

struct udp_pcb *upcb,

struct pbuf *p,

struct ip_addr *addr,

u16_t port),

void *recv_arg)

参数

pcb:指定一个连接(pcb)

recv: 指定数据包接收到时的回调函数

recv_arg:传递给回调函数的参数

返回

感谢各位的阅读!关于“lwip中TCP和UDP的API有哪些”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI