LWIP之SOCKET的实现(11)
参数:sockFd已创建、绑定并监听的插口;clientAddr远端连接信息;addrLen结构体长度。
-------------------------------------------------------------------- #include
int connect ( int sockFd, struct sockaddr *servAddr, int addrLen ); TCP/UDP客服端申请TCP/UDP服务器的链接。
参数:sockFd已创建的插口;servAddr服务器连接信息;addrLen结构体长度。 返回0成功,-1出错
-------------------------------------------------------------------- #include
int select( int n, fd_set *read_fds, fd_set *write_fds, fd_set *exceptfds, struct timeval *timeout );
挂起当前线程,等待特定事件发生或定时器过期。本函数可以指定4类特定事件:read、write、exception和超时。返回插口ID表示事件有响应,0表示超时,-1表示出错。
参数:n应该大于所有插口ID,用FD_SETSIZE代替;后面三个fd_set结构体存储三种插口事件位图: typedef struct fd_set {
fd_mask fds_bits[(FD_SETSIZE + NFDBITS - 1) / NFDBITS]; } fd_set;
用以下四个宏修改:
FD_SET(fd, fdset) fd插口ID,fdset是fd_set结构体地址,设置插口事件为真 FD_CLR(fd, fdset)设置插口事件为假 FD_ISSET(fd, fdset)获取插口状态,是否设置 FD_ZERO(fdset)清除所有设置 第四个参数timeval结构体如下: struct timeval {
int tv_sec; /* 秒 */ int tv_usec; /* 毫秒 */ };
用来设置超时时间。
-------------------------------------------------------------------- #include
int send ( int sockFd, const void *msg, int msgLen, unsigned int flags); int sendto ( int sockFd, const void *msg, int msgLen, unsigned int flags, const struct sockaddr *to, int toLen);
这两个函数都用来按插口发送数据包,send用在已经连接的插口,sendto用在没有连接上的插口。
send函数的参数:sockFD插口ID,msg要发送的数据指针,msgLen要发送的数据长度,flags发送选项(按位)
sendto函数的参数:UDP专用,插口必须是SOCK_DGRAM类型。由于没有连接,所以sendto函数增加了两个与连接有关的参数。to定义目标地址的结构体,toLen是结构体长度。sockaddr结构体如下: struct sockaddr { u_short sa_family; char sa_data[14]; };
这两个函数返回值均为实际发送字节的长度(软件需要调整偏移量将数据全部发送),-1表示发送不成功。
-------------------------------------------------------------------- #include
int recv ( int sockFd, const void *msg, int msgLen, unsigned int flags); int recvfrom ( int sockFd, const void *msg, int msgLen, unsigned int flags, const struct sockaddr *from, int *fromLen);
这两个函数均是按插口来接收数据包,recv函数用在已连接插口上,recvfrom用在未连接插口上。
recv函数参数:sockFd插口ID,msg接收缓存地址,msgLen接收缓存最大空间,flags接收选项。
recvfrom函数参数:UDP专用,插口必须是SOCK_DRAM类型。由于没有连接,所以recvfrom函数增加了两个与连接有关的参数。from定义目标地址的结构体,formLen是结构体长度。
两个函数均返回接收到的数据数,-1接收错误,0表示目标地址已经传输完毕并关闭连接。
-------------------------------------------------------------------- #include
int setsockopt ( int sd, int level, int optname, const void *optval, socklen_t optlen);
int getsockopt ( int sd, int level, int optname, void *optval, socklen_t *optlen );
setsockopt函数用来改变插口的模式,这种改变是通过修改插口选项实现的。 getsockopt函数用来获取插口选项的值。
参数:sd插口ID;level协议栈选项,包括SOL_SOCKET(插口层)、IPPROTO_TCP(TCP层)和IPPROTO_IP(IP层);optname需要修改的选项名;optval修改值地址;optlen修改值长度。 返回0表示成功。
-------------------------------------------------------------------- #include
int getsockname ( int sd, struct sockaddr *addr, int *addrLen ); int getpeername ( int sd, struct sockaddr *addr, int *addrLen );
getsockname函数用于从已连接的插口中获取本地地址信息。getpeername函数用于获取远端地址信息。
参数:sd插口ID;addr地址信息结构体;addrLen结构体长度。 返回0成功,-1错误
-------------------------------------------------------------------- #include
int close ( int sd );
关闭插口通信(丢弃未发送的数据包并拒绝接受数据)
-------------------------------------------------------------------- #include
int shutdown ( int sockFd, int how ); 该函数提供了更大的权限控制插口的关闭过程。
参数:sockFd插口ID;how仅能为0、1和2这三个值 0表示停止接收当前数据并拒绝以后的数据接收 1表示停驶发送数据并丢弃未发送的数据 2是0和1的合集
-------------------------------------------------------------------- int read (int sockFD, void *buffer, UInt32 numBytes);
从指定插口中等待数据接收并存放到buffer中。该函数会挂起线程,直到有数据接收到。
参数:sockFd插口ID;buffer缓存地址;numBytes缓冲大小
该函数返回接收到的数据大小,-1表示出错,0表示远端已经关闭连接。 -------------------------------------------------------------------- int write (int sockFD, void *buffer, UInt32 numBytes); 将缓存中数据写到指定插口准备发送。
参数:sockFd插口ID;buffer缓存地址;numBytes缓存中数据大小 该函数返回实际发送的数据量,-1表示出错。
-------------------------------------------------------------------- 补充:
lwIP协议栈在socket模式下也就是操作系统中运行,创建进程的方式与操作系统中创建进程的方式有所不同。要用专用函数:
sys_thread_t sys_thread_new(char *name, void(* thread)(void *arg), void *arg, int stacksize, int prio)
参数:name线程说明;thread线程函数;arg线程函数的参数;stacksize线程堆栈大小;prio线程优先级
在lwIP下创建线程统一使用此函数,当然这个函数也是要调用系统创建线程的API的。
非标准Socket接口,lwip提供了一套Socket API,这套API的标准与正常操作系统下的Socket API的形式不是很一致,我们先前已经在这套API上实现了Web Server,已测试在没有Mobile IP环境下工作正常。
下面我们就一个lwip典型的UDP协议工作过程作为对lwip的简单介绍。 UDP发送过程:
相关推荐:
- [实用模板]第八章:法国“新浪潮”与“左岸派”
- [实用模板]2021年北京上半年临床医学检验技师生物
- [实用模板]SAP GUI 7.10客户端安装配置文档
- [实用模板]2001年临床执业医师资格考试综合笔试试
- [实用模板]36机场工作实用英语词汇总结
- [实用模板](一)社会保险稽核通知书
- [实用模板]安全教育主题班会材料
- [实用模板]濉溪县春季呼吸道传染病防控应急演练方
- [实用模板]长沙房地产市场周报(1.30-2.3)
- [实用模板]六年级数学上册典中点 - 图文
- [实用模板]C程序设计(红皮书)习题官方参考答案
- [实用模板]中国证监会第一届创业板发行审核委员会
- [实用模板]桥梁工程复习题
- [实用模板]2011学而思数学及答案
- [实用模板]初中病句修改专项练习
- [实用模板]监理学习知识1 - 图文
- [实用模板]小机灵杯四年级试题
- [实用模板]国贸专业毕业论文模板
- [实用模板]教育学概论考试练习题-判断题4
- [实用模板]2015届高考英语一轮复习精品资料(译林
- 00Nkmhe_市场营销学工商管理_电子商务_
- 事业单位考试法律常识
- 诚信教育实施方案
- 吉大小天鹅食品安全检测箱方案(高中低
- 房地产销售培训资料
- 高一地理必修1复习提纲
- 新概念英语第二册lesson_1_练习题
- 证券公司内部培训资料
- 小学英语时间介词专项练习
- 新世纪英语专业综合教程(第二版)第1册U
- 【新课标】浙教版最新2018年八年级数学
- 工程建设管理纲要
- 外研版 必修一Module 4 A Social Surve
- Adobe认证考试 AE复习资料
- 基于H.264AVC与AVS标准的帧内预测技术
- 《食品检验机构资质认定管理办法》(质
- ABB变频器培训课件
- (完整版)小学说明文阅读练习题及答案
- 深思洛克(SenseLock) 深思IV,深思4,深
- 弟子规全文带拼音




