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)\来提供顺序控制流.这使得原始套接字在内存方面变得轻