15.网络编程

1.tcp循环服务器
2.tcp并发服务器
3.五种IO模式
同步:阻塞,非阻塞,多路复用,信号驱动
异步:异步

阻塞与非阻塞 同步与异步: 首先一个IO操作其实分成了两个步骤:发起IO请求和实际的IO操作,同步IO和异步IO的区别就在于第二个步骤是否阻塞,如果实际的IO读写阻塞请求进程,那么就是同步IO,因此阻塞IO、非阻塞IO、IO服用、信号驱动IO都是同步IO,如果不阻塞,而是操作系统帮你做完IO操作再将结果返回给你,那么就是异步IO。阻塞IO和非阻塞IO的区别在于第一步,发起IO请求是否会被阻塞,如果阻塞直到完成那么就是传统的阻塞IO,如果不阻塞,那么就是非阻塞IO。
同步是两个对象之间的关系,而阻塞是一个对象的状态。阻塞可以是实现同步的一种手段!
1) 阻塞io模型 阻塞IO模型是最常见的IO模型了,对于所有的“慢速设备”(socket、pipe、fifo、terminal)的IO默认的方式都是阻塞的方式。阻塞就是进程放弃cpu,让给其他进程使用cpu。进程阻塞最显著的表现就是“进程睡眠了”。阻塞的时间通常取决于“数据”是否到来。
2) 非阻塞io模型 :非阻塞IO就是设置IO相关的系统调用为non-blocaking,随后进行的IO操作无论有没有可用数据都会立即返回,并设置errno为EWOULDBLOCK或者EAGAIN。
3) 多路复用 :多路复用是让阻塞发生在我们的多路复用IO操作的系统调用上面,而不是我们真正去执行IO的系统调用。使用这个方式的好处就是可以同时监控多个用于IO的文件描述符 (基本思想:构造一张有关描述符的表,然后调用一个函数。当这些文件描述符中的一个或多个已准备好进行IO时函数才返回)
4) 信号驱动 :所谓信号驱动,就是利用信号机制,安装信号SIGIO的处理函数(进行IO相关操作),通过监控文件描述符,当其就绪时,通知目标进程进行IO操作(signal handler)
5) 异步    Linux上异步IO有一组POSIX规定的接口,已aio开头的几个SYSCALL
IO模型函数:
int fcntl(int fd,int cmd,..../* arg*/):fd  文件描述符     cmd:操作命令    arg:供命令使用的参数
利用fcntl实现非阻塞步骤:
int flag
flag=fcntl(fd,F_GETFL,0);
flag |=O_NONBLOCK;
fcntl(fd,F_SETFL,flag);
int select(int nfds,fd_set *readfds,fd_set *writefds,fd_set *exceptfds,struct timeval *timeout):调用本函数时进程会一直阻塞直到有文件可读,可写或超出设置的时间时,才返回结果,函数的返回值为文件描述符词状态改变的个数
FD_CLR(s,*set):从集合set中删除描述字s。
FD_ISSET(s,*set):若s为集合中一员,非零;否则为零。
FD_SET(s,*set):向集合添加描述字s。
FD_ZERO(*set):将set初始化为空集NULL。
超时检测函数
1)设置socket的属性SO_RCVTIMEO:
sturct timeval tv
tv={5,0};
setsocket(sockfd,SOL_SOCKET,SO_RCVTIMEO,&tv,sizeof(tv));
2)用select检测socket是否ready:
struct fd_set rdfs;
struct timeval tv={5,0};
FD_ZERO(&rdfs);
FD_SET(sockfd,&rdfs);
if(select(sockfd+1,&rdfs,NULL,NULL,&tv)> 0)
{
    recv/recvfrom();
}
3)unsigned int alarm(unsigned int seconds):设置时间,等待时间到之前无IO操作,就退出
4)sigaction
用法如下:

猜你喜欢

转载自blog.csdn.net/qq_33575901/article/details/80980253