IMX8M学习--MYZR-i.MX8M-EVK网络编程进阶(TCP)

一、网络编程IO模型

1、 阻塞IO : 一直等待数据的到达!
2、 非阻塞IO : 询问数据是否到达,如果没有数据,则不会阻塞,会马上退出!

二、设置非阻塞IO的步骤

1、 建立一个文件描述符 : 默认都是阻塞!
2、 设置非阻塞属性给文件描述符 : 文件描述符就是非阻塞!
3、 再调用accept()/read()/recv()/recvfrom() :非阻塞读取。

三、 如何给文件描述符设置非阻塞属性?
使用fcntl()
man fcntl
#include <unistd.h>
#include <fcntl.h>
int fcntl(int fd, int cmd, … /* arg */ );

fd: 需要设置属性的文件描述符
cmd: F_GETFL(void) 获取该文件描述符的属性 arg忽略
F_SETFL(long) 设置该文件描述符的属性 需要填arg
arg: 添加的属性
四、多路复用?
1、什么是多路复用?
就是先将需要进行监听的文件描述符加入一个集合中,然后在规定的时间/无限等待去监听这个集合。如果在规定的时间内,集合的某个文件描述符有数据到达,则其他没有数据到达的文件描述符就会剔除到集合之外。我们用户需要监听集合中有没有文件描述符即可。

2、 如何实现多路复用?
1)如何实现监听集合?
select()
man 2 select
#include <sys/select.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>

接口声明:int select(int nfds, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, struct timeval *timeout);

参数:
nfds:所有正在监测的套接字的最大值加1
readfds:读就绪文件描述符集合 -> 需要监听集合
writefds:写就绪文件描述符集合
exceptfds:异常就绪文件描述符集合
timeout:超时控制 -> 如果是无限等待,则填NULL。

struct timeval {
long tv_sec; /* seconds / 秒
long tv_usec; /
microseconds */ 微秒 精确小数点后6位!
};

返回值:
成功: 有数据到达 就绪的文件描述符的总数
没有数据到达 0
失败: -1

2)如何将文件描述符添加到集合中?
void FD_ZERO(fd_set *set); FD_ZERO() clears a set.
void FD_SET(int fd, fd_set *set); 将某个文件描述符加入到集合中
void FD_CLR(int fd, fd_set *set); 将某个文件描述符从集合中删除
int FD_ISSET(int fd, fd_set *set); 判断某个文件描述符是否在集合中

五、超时接收
1、 使用多路复用的最后一个参数
struct timeval {
long tv_sec; /* seconds / 秒
long tv_usec; /
microseconds */ 微秒 精确小数点后6位!
};

例子:
struct timeval v;
v.tv_sec = 10;
v.tv_usec = 0; 每次select都需要重新设定一个新的时间!:
如果在规定的时间内没有数据变化,则select函数返回0。

2、设置套接字属性为超时属性。
1)超时属性的特点:
如果不设定超时属性,那么套接字本身是无限等待数据的到达!

2)如何设置超时属性?
setsockopt()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值