教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 精品文档 > 实用模板 >

LWIP之SOCKET的实现(11)

来源:网络收集 时间:2026-05-15
导读: 参数:sockFd已创建、绑定并监听的插口;clientAddr远端连接信息;addrLen结构体长度。 -------------------------------------------------------------------- #include #include int connect ( int sockFd, stru

参数:sockFd已创建、绑定并监听的插口;clientAddr远端连接信息;addrLen结构体长度。

-------------------------------------------------------------------- #include #include

int connect ( int sockFd, struct sockaddr *servAddr, int addrLen ); TCP/UDP客服端申请TCP/UDP服务器的链接。

参数:sockFd已创建的插口;servAddr服务器连接信息;addrLen结构体长度。 返回0成功,-1出错

-------------------------------------------------------------------- #include #include #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 #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 #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 #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发送过程:

1.应用 …… 此处隐藏:3770字,全部文档内容请下载后查看。喜欢就下载吧 ……

LWIP之SOCKET的实现(11).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wendang/520675.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)