高级编程之网络编程(三)
2016-01-22 15:23
288 查看
IO 模型
1、阻塞模型
fifo pipe read fgetc fgets fread recv recvfrom
以上获取数据的函数默认都是阻塞方式接收数据。
2、非阻塞模型
2.1 在开始阶段的open函数部分调整 。
open("./fifo",O_RDONLY|O_NONBLOCK);
函数 open read ....都不会阻塞。
2.2 在文件打开之后操作过程中调整。
fcntl()===>用法
int flag ;
flag = fcntl(fd,F_GETFL,0);///获取当前fd文件的属性。
flag = flag | O_NONBLOCK; ///修改当前属性为非阻塞方式。
fcntl(fd,F_SETFL,flag); ///设置当前fd文件的属性为flag
3、多路复用模型
3.1 简单循环服务器
由服务器端为每个新链接创建一次链接过程并获取数据
之后关闭链接,等待下一个新链接。
while(1)
{
newfd = accept()
....read/wait
close(newfd);
}
适用范围:数据通信过程短,发送数据少,实时时间短。
缺陷:每次客户端发送完毕下次发送需要重链。
3.2 fork循环服务器
服务器为客户端的链接每次新建一个子进程用来保持通信
父进程继续循环检测,如果还有新链接则继续fork子进程。
while(1)
{
newfd = accpet();
if(newfd > 0)
{
count++;
pid= fork();
if(pid == 0)
{
deal_recv();
exit(0);
}
}
else
{
perror(accept);
reutrn -1;
}
if(count >40) break;
}
for(i=0;i<40;i++)
{
wait(NULL);
}
缺陷:1 、有僵尸进程出现
2、客户端退出服务器无法获取。
3、资源消耗大
4、子进程退出不方便回收
适用范围: 客户端个数少
客户端能正常退出并有一定时间范围。
3、select循环服务器 ====>通过select 函数完成IO的多路复用。
头文件: sys/select.h sys/time.h sys/types.h unistd.h
函数:int select(int nfds, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, struct timeval *timeout);
功能:通过该函数可以动态检测当前指定的文件描述符集合中有
数据变化的文件描述符,并将其他描述符删除,只保留当
前有数据流的描述符。同时该函数具有阻塞等待功能。
参数:nfds 当前进程打开的最大描述符的边界值。
readfds 读操作的描述符集合
writefds 写操作的描述符集合
exectpfds 异常描述符集合。如果为NULL表示不对异常描述符处理。
timeout 超时设置,如果该值为NULL表示一直阻塞检测。
返回值:成功 0
失败 -1;
void FD_CLR(int fd, fd_set *set);
功能:将描述符集合set中的fd描述符删除。
int FD_ISSET(int fd, fd_set *set);
功能:判断fd描述符是否在set集合中。如果是则返回真,否则假。
void FD_SET(int fd, fd_set *set);
功能:将fd描述符添加到set集合中。
void FD_ZERO(fd_set *set);
功能:将set集合中所有描述符删除。
练习:用select 函数完成一个并发文件服务器,可以接收客户端
发送的文件并以客户端IP形式存储到本地服务器。
1、阻塞模型
fifo pipe read fgetc fgets fread recv recvfrom
以上获取数据的函数默认都是阻塞方式接收数据。
2、非阻塞模型
2.1 在开始阶段的open函数部分调整 。
open("./fifo",O_RDONLY|O_NONBLOCK);
函数 open read ....都不会阻塞。
2.2 在文件打开之后操作过程中调整。
fcntl()===>用法
int flag ;
flag = fcntl(fd,F_GETFL,0);///获取当前fd文件的属性。
flag = flag | O_NONBLOCK; ///修改当前属性为非阻塞方式。
fcntl(fd,F_SETFL,flag); ///设置当前fd文件的属性为flag
3、多路复用模型
3.1 简单循环服务器
由服务器端为每个新链接创建一次链接过程并获取数据
之后关闭链接,等待下一个新链接。
while(1)
{
newfd = accept()
....read/wait
close(newfd);
}
适用范围:数据通信过程短,发送数据少,实时时间短。
缺陷:每次客户端发送完毕下次发送需要重链。
3.2 fork循环服务器
服务器为客户端的链接每次新建一个子进程用来保持通信
父进程继续循环检测,如果还有新链接则继续fork子进程。
while(1)
{
newfd = accpet();
if(newfd > 0)
{
count++;
pid= fork();
if(pid == 0)
{
deal_recv();
exit(0);
}
}
else
{
perror(accept);
reutrn -1;
}
if(count >40) break;
}
for(i=0;i<40;i++)
{
wait(NULL);
}
缺陷:1 、有僵尸进程出现
2、客户端退出服务器无法获取。
3、资源消耗大
4、子进程退出不方便回收
适用范围: 客户端个数少
客户端能正常退出并有一定时间范围。
3、select循环服务器 ====>通过select 函数完成IO的多路复用。
头文件: sys/select.h sys/time.h sys/types.h unistd.h
函数:int select(int nfds, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, struct timeval *timeout);
功能:通过该函数可以动态检测当前指定的文件描述符集合中有
数据变化的文件描述符,并将其他描述符删除,只保留当
前有数据流的描述符。同时该函数具有阻塞等待功能。
参数:nfds 当前进程打开的最大描述符的边界值。
readfds 读操作的描述符集合
writefds 写操作的描述符集合
exectpfds 异常描述符集合。如果为NULL表示不对异常描述符处理。
timeout 超时设置,如果该值为NULL表示一直阻塞检测。
返回值:成功 0
失败 -1;
void FD_CLR(int fd, fd_set *set);
功能:将描述符集合set中的fd描述符删除。
int FD_ISSET(int fd, fd_set *set);
功能:判断fd描述符是否在set集合中。如果是则返回真,否则假。
void FD_SET(int fd, fd_set *set);
功能:将fd描述符添加到set集合中。
void FD_ZERO(fd_set *set);
功能:将set集合中所有描述符删除。
练习:用select 函数完成一个并发文件服务器,可以接收客户端
发送的文件并以客户端IP形式存储到本地服务器。
相关文章推荐
- 高级编程之网络编程(二)
- Project Euler 107:Minimal network 最小网络
- 高级编程之网络编程(一)
- discuz登录出现HTTP Error 404. The requested resource is not found.
- POJ 3281 Dining (网络流)
- SpringMVC之表单提交===③===多文件上传表单 http://h-king.iteye.com/blog/2269217
- POJ 2391 Ombrophobic Bovines (网络流)
- ansible网络模块安装httplib2
- ansible网络模块安装httplib2
- http
- Http协议认证
- HTTP 协议详解与HTTP 协议压缩
- nginx配置-http和https
- POJ 1637 Sightseeing tour (网络流解决混合图欧拉回路问题)
- HTTP错误404.13 - Not Found 请求筛选模块被配置为拒绝超过请求内容长度的请求
- TCP 端口号用尽解决方案
- 常用三个网络协议
- 网络篇-NSURLConnection进度下载
- 网络篇-NSURLSessionDownloadTask进度下载(续上节)
- 1、大部分社交平台接口不支持https协议。