linux网络编程笔记

网络编程的四种IO模型
什么是IO模型?
网络编程中对于数据的输入/输出的方式:阻塞IO、非阻塞IO、信号驱动、多路复用
有什么特点?
阻塞IO:一直等待一个套接字的数据到来,如果没有就阻塞
例如:read、recv、recvfrom、accept
非阻塞IO:和阻塞IO相反,不会等待数据到来,如果没有数据到来直接返回失败
函数本身其实并不会阻塞,而是因为里面的参数而阻塞,例如文件描述符
一般都是根据文件属性来决定是否阻塞,例如普通文件在用read读取时就不会阻塞
所以可以通过修改文件的属性来设置
信号驱动:当文件描述符有数据到来时其实会产生一个信号:SIGIO
可以通过判断这个信号是否产生来判断是否有数据到来
多路复用:将某些文件描述符添加到一个集合中,接着监听这个集合中是否产生了就绪
就绪:读就绪、写就绪、异常就绪

一、非阻塞IO
如何修改文件属性?
int fcntl(int fd, int cmd, … /* arg */ );
参数:
int fd:文件描述符
int cmd:选项
File status flags
F_GETFL (void)//void表示第三参数的类型为没有参数
获取文件当前的权限和属性,选择这个参数,第三个参数可以忽略
F_SETFL (int)//int表示第三个参数的类型为int型
可以设置的选项有:(O_APPEND,O_ASYNC,O_DIRECT,O_NOATIME,O_NONBLOCK)
… :变参部分,根据选项决定是否有第三个参数
返回值:
F_GETFL:文件当前的属性
注意:
要设置属性的话,最在保留原本属性基础上再加新的属性
而阻塞和非阻塞是相对的,所以会被对方覆盖
如何保留原本的属性再加上新属性?
先获取出原本的属性值,在或上新的属性

二、信号驱动
文件描述符在有数据到来时,可以产生一个SIGIO信号
而这个信号的产生需要设置文件描述符的属性:O_ASYNC
思考:当文件描述符产生了信号后,这个信号发给谁?
需要设置文件描述符的属主才能让这个信号在产生时发送给所属主进程
步骤:
设置文件描述符的属主
F_SETOWN (int)
第三参数就为进程ID号
开启文件描述符的信号驱动属性
在保留原属性基础上添加新属性
设置信号的处理方式
signal(SIGIO,recv_data);

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值