uip源码分析(5)

2019-07-27 10:17

UIP中文文档第四 应用层要调用的函数

这一部分包含的内容较多,包括一些宏定义和函数. 宏定义::

#define uip_outstanding(conn) ((conn)->len)

#define uip_datalen() 存放在uip_appdata中的现行可用的传入数据长度 #define uip_urgdatalen() 到达连接的带外数据长度(紧急的) #define uip_close() 关闭当前连接 #define uip_abort() 中止当前连接

#define uip_stop() 告诉发送方主机停止发送数据

#define uip_stopped() 查明当前连接是否以前被uip_stop()停止过. #define uip_restart() 如果当前连接被uip_stop()停止过,重新开始. #define uip_udpconnection() 查明当前连接是否是udp连接. #define uip_newdata() 查明新传入的数据是否可用

#define uip_acked() 查明以前发送的数据是否得到回应了 #define uip_connected() 查明连接是否连接上了. #define uip_closed() 查明连接是否是被另一端关闭. #define uip_aborted() 查明连接是否被另一端中止. #define uip_timeout() 查明连接是否超时.

#define uip_rexmit() 查明是否需要将上次传送的数据重新传送. #define uip_poll() 查明连接是否被uip轮询了.

#define uip_initialmss() 获得当前连接的初始最大段大小. #define uip_mss() 获取可以在当前连接上发送的最大段大小. #define uip_udp_remove(conn) 移除一个udp连接.

#define uip_udp_bind(conn,port) 绑定一个udp连接到本地端口

#define uip_udp_send(len) 在当前连接上发送一个长度为len的udp数据报.

void uip_listen(u16_t port); 开始监听指定的端口. void uip_unlisten(u16_t port);停止监听指定的端口.

uip_conn * uip_connect(uip_ipaddr_t * ripaddr, u16_t port); 通过TCP连接到远程主机. void uip_send(const void * data,int len); 在当前连接上发送数据.

uip_udp_conn * uip_udp_new(uip_ipaddr_t * ripaddr ,u16_t port);建立一个新的udp连接.

1. #define uip_datalen()

如果有当前可用的传入数据的话,获取其长度.必需先调用uip_data()查明是否有当前可用的传入数据. 应有例程:

dhcpc.c, telnetd.c, and webclient.c. 此宏定义于uip.h的550行. 2. #define uip_urgdatalen()

任何到达连接的带外数据(紧迫数据)长度.要使用此宏,应配置UIP_URGDATA宏为真. 此宏定义于

此宏定义于uip.h的561行. 3. #define uip_close()

此函数会以一种谨慎的方式关闭连接.

应用例程: telnetd.c.

此宏定义于uip.h的570行. 4. #define uip_abort()

此函数用于中止(重置)当前连接,多用于出现错误导致无法使用uip_close()的场合. 应用示例: webclient.c.

此宏定义于uip.h的581行. 5. #define uip_stop()

告诉发送主机停止发送数据.此函数会关闭接收机窗口,停止从当前连接接收数据. 此宏定义于uip.h的591行.

6. #define uip_restart()

如果当前连接曾被uip_stop()停止,那么重新开始. 该函数会重新打开接收机窗口,从当前连接上接收数据. 此宏定义于uip.h的610行. 7. #define uip_udpconnection() 此函数查明当前连接是否是一个udp连接. 此宏定义于uip.h的626行. 8. #define uip_newdata()

如果uip_appdata指针所指之处有送给应用的新数据,此宏得到一个非零值.数据的大小可以通过uip_len获得. 应用例程:

dhcpc.c, resolv.c, telnetd.c, and webclient.c. 此宏定义于uip.h的637行. 9. #define uip_acked()

如果上次发送给远程主机的数据得到回应了,此宏得到一个非零值,这意味着应用可以发送新的数据. 应用例程:

telnetd.c, and webclient.c. 此宏定义于uip.h的648行. 10. #define uip_connected()

如果当前连接己经与远程主机连接,则此宏得到非零值.这包括两种情形,一是连接被主动打开(通过uip_connect()),二是连接被被动打开(通过uip_listen()). 应用例程:

hello-world.c, telnetd.c, and webclient.c 此宏定义于uip.h的660行. 11. #define uip_closed()

如果远程主机关闭了当前连接,则此宏得到非零值.这时应用可能要做一些清理工作. 应用例程:

smtp.c, telnetd.c, and webclient.c. 此宏定义于uip.h的670行.

12. #define uip_aborted()

如果当前连接被远程主机中止或重置,则为非零值. 应用例程:

smtp.c, telnetd.c, and webclient.c此宏定义于uip.h的680行. 13. #define uip_timeout()

如果当前连接由于多次重传导致超时中止,则为非零值. 应用例程:

smtp.c, telnetd.c, and webclient.c此宏定义于uip.h的690行. 14. #define uip_rexmit()

如果上次传输的数据在网络中丢失,而应用应该重新传输,则此宏得非零值.应用应该使用uip_send()重新传输与上次传输的完全相同的数据. 应用例程:

telnetd.c, and webclient.c. 该宏定义于uip.h中的702行. 参考webclient_appcall(). 15. #define uip_poll()

这个宏解决的问题是连接是不是由uIP轮询的. 应用例程:

resolv.c, telnetd.c, and webclient.c. 此宏定义于uip.h中的716行.

参考 httpd_appcall(),resolv_appcall(), and webclient_appcall(). 16. #define uip_mss()

在连接上传送的当前最大段大小是由接收机的窗口计算和连接的MSS计算的(它可以由uip_initialmss()计算). 应用例程:

telnetd.c, and webclient.c. 此宏定义于uip.h中的737行. 17. #uip_udp_remove(conn) 移除一个udp连接. 参数:

conn 指向代表连接的uip_udp_conn的结构体. 应用例程: resolv.c.

此宏定义于uip.h中的775行. 参考resolv_conf();

18. #define uip_udp_bind(conn,port) 绑定一个udp连接到本地端口. 参数:

conn 指向代表udp连接的uip_udp_conn结构体的指针. port 本地端口号,以网络字节顺序. 应用例程: dhcpc.c.

此宏定义于uip.h中的775行. 19. #define uip_udp_send(len)

在当前连接收发送一个长度为len的数据报.

该函数只有在udp事件(轮询或新数据)才能调用.要发送的数据要提前送到uip_buf缓冲区中uip_appdata指针所指示的位置. 参数:

len 存放在uip_buf中,要发送的数据报的长度. 应用例程: resolv.c.

此宏定义于uip.h中的800行. 20. void listen(u16_t port) 开始监听指定端口. 注意:

由于此函数中所用的参数port是网络字节顺序的,所以需要用到转换函数HTONS()或htons().

1. uip_listen(HTONS(80));

参数:

port 一个16位以网络字节顺序的端口号. 应用例程:

hello-world.c, and telnetd.c. 此宏定义于uip.h中的529行. 21. void uip_unlisten(u16_t port) 停止监听指定端口. 注意:

由于这里面用到的port是以网络字节顺序的,所以需要用到HTONS()或htons()函数.

1. uip_ipaddr_t ipaddr;

2. uip_ipaddr(&ipaddr, 192,168,1,2); 3. uip_connect(&ipaddr, HTONS(80))

参数:

ripaddr 远程主机的IP地址. port 16位的网络字节顺序的端口号. 返回值:

指向新连接的连接标识符的指针,当没有分配新连接时为NULL. 应用例程:

smtp.c, and webclient.c. 此函数定义于uip.c的407行. 引用了htons(),

uip_conn::lport, uip_conn::tcpstateflags, UIP_CLOSED, uip_conn, UIP_CONNS, and uip_conns. 22. void uip_send( void *data, int len) 在当前连接上发送数据

此函数用于发送一个单段TCP数据.只有uIP因为事件处理而请求的应用才能发送数据.

调用这个函数后实际发送数据量多少取决于TCP允许的数据量多少.uIP会自动裁剪数据,以保证发出去的数据是适量的.可以用uip_mss()来查询实际可以发送的数据量.

注意:

此函数不保证发送的数据能到达目的地.如果数据在网络中丢失,应用会接到请求,此求时uip_rexmit()事件被置位.这时应用就得使用此函数重发数据. 参数:

data 指向将要发送的数据的指针. len 要发送的数据的长度最大值. 应用例程:

dhcpc.c, telnetd.c, and webclient.c. 此函数定义于uip.c的1888行. 引用了uip_sappdata, and uip_slen.

23. struct uip_udp_conn * uip_udp_new(uip_ipaddr_t * ripaddr ,u16_t rport) 建立新的UDP连接.

此函数用于建立一个新的UDP连接.此函数会自动为新连接分配一个本地未使用的端口.然而,也可以调用uip_udp_new函数之后,调用uip_udp_bind()选择一个新的端口. 例如:

1. 2. 3. 4. 5. 6. 7. 8.

uip_ipaddr_t addr; struct uip_udp_conn *c;

uip_ipaddr(&addr, 192,168,2,1);

c = uip_udp_new(&addr, HTONS(12345)); if(c != NULL) {

uip_udp_bind(c, HTONS(12344)); }

参数: ripaddr 远程主机的IP地址. rport 远程主机的端口号,以网络字节顺序. 返回值: 指向新连接结构体uip_udp_conn的指针,如果连接未能分配则为NULL. 应用例程: dhcpc.c, and resolv.c. 定义于uip.c的473行. 引用了htons(), uip_udp_conn::lport, uip_udp_conn, UIP_UDP_CONNS, and uip_udp_conns. UIP中文文档第五 原始套接字(protosockets)库

详细说明:

原始套接字(protosocket)为uIP提供了一个与传统BSD套接字接口类似的接口.

不同于为传统uIP事件驱动接口写的程序,为原始套接字(protosocket)接口写的程序是顺序方式执行的,并且无需以明确的状态机方式实现.

原始套接字(protosocket)只能用于TCP连接.

原始大接字(protosocket)库使用\原始线程(protothreads)\来提供顺序控制流.这使得原始套接字在内存方面变得轻


uip源码分析(5).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:公开课 价值与价值观 教案

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: