Linux网络编程之三
2015-10-10 10:55
239 查看
每日一结
Tftp服务器的实现:
server.c
client.c
代码分析如下:
一 Linux IO模型
(1)阻塞IO
(2)非阻塞IO
非阻塞IO的实现
(3)IO多路复用
(4)信号驱动IO
二 IO多路复用
(1)创建文件描述符的表
(2)将需要检测的fd进入文件描述符表
(3)调用select等待fd就绪
注意:如果文件描述符表中有fd就绪,select会立即返回,并且清除未就绪的文件描述符
int select(int nfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *timeout);
参数:
@nfds 最大的描述符 + 1
@readfds 读集合 ,文件描述符可读则就绪
@writefds 写集合 ,文件描述符可写则就绪
@exceptfds 异常集合,出错则就绪
@timeout NULL:阻塞方式调用 超时时间0:非阻塞方式调用 超时时间不为0:在指定的时间内,没有fd就绪则返回
返回值:
成功返回就绪文件描述符的个数,失败返回-1,超时返回 0
---------------------------------------------------------
思考:怎么定义一个文件描述符表
fd_set readfds;
------------------------------------------------------------
//将fd从fd_table清除
void FD_CLR(int fd, fd_set *set);
//判断fd是否在fd_table
int FD_ISSET(int fd, fd_set *set);
//将fd加入fd_table
void FD_SET(int fd, fd_set *set);
//将fd_table清0
void FD_ZERO(fd_set *set);
select()函数的用法示例如下:
server.c
client.c
代码分析如下:
三 问题:如何通过UDP协议来保证数据的可靠性?
模拟TCP的做法
(1)数据包序号
(2)接收方有应答
注意:
关于套接字的读写规则socket,它是和管道的读写规则一样,关于其读写规则一定要理解着去记住。
(1)读端存在,写管道
可以正常写入,如果管道满则写管道的进程阻塞
(2)读端不存在,写管道
此时写管道没有意义,OS会发送SIGPIPE信号杀死写管道的进程
---------------------------------------------------------
(1)写端存在,读管道
管道中有数据,读取数据,如果管道中没有数据,读管道的进程会阻塞
(2)写端不存在,读管道
管道中有数据,读取数据,如果管道中没有数据,读管道不阻塞立即返回
关于一些小技巧:
I.若你在vim中,打开了两个窗口,若想进行两个窗口的复制粘贴,则需要先将其分页(vsp)才可再用y 和 p
II.在Vim中,如果按d就表示剪切,之后按p进行粘贴。
III.在Vim中,u是撤销,ctrl + r 是撤销的撤销(恢复)
关注微信公众号获取更多资讯
Tftp服务器的实现:
server.c
client.c
代码分析如下:
一 Linux IO模型
(1)阻塞IO
(2)非阻塞IO
非阻塞IO的实现
(3)IO多路复用
(4)信号驱动IO
二 IO多路复用
(1)创建文件描述符的表
(2)将需要检测的fd进入文件描述符表
(3)调用select等待fd就绪
注意:如果文件描述符表中有fd就绪,select会立即返回,并且清除未就绪的文件描述符
int select(int nfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *timeout);
参数:
@nfds 最大的描述符 + 1
@readfds 读集合 ,文件描述符可读则就绪
@writefds 写集合 ,文件描述符可写则就绪
@exceptfds 异常集合,出错则就绪
@timeout NULL:阻塞方式调用 超时时间0:非阻塞方式调用 超时时间不为0:在指定的时间内,没有fd就绪则返回
返回值:
成功返回就绪文件描述符的个数,失败返回-1,超时返回 0
---------------------------------------------------------
思考:怎么定义一个文件描述符表
fd_set readfds;
------------------------------------------------------------
//将fd从fd_table清除
void FD_CLR(int fd, fd_set *set);
//判断fd是否在fd_table
int FD_ISSET(int fd, fd_set *set);
//将fd加入fd_table
void FD_SET(int fd, fd_set *set);
//将fd_table清0
void FD_ZERO(fd_set *set);
select()函数的用法示例如下:
server.c
client.c
代码分析如下:
三 问题:如何通过UDP协议来保证数据的可靠性?
模拟TCP的做法
(1)数据包序号
(2)接收方有应答
注意:
关于套接字的读写规则socket,它是和管道的读写规则一样,关于其读写规则一定要理解着去记住。
(1)读端存在,写管道
可以正常写入,如果管道满则写管道的进程阻塞
(2)读端不存在,写管道
此时写管道没有意义,OS会发送SIGPIPE信号杀死写管道的进程
---------------------------------------------------------
(1)写端存在,读管道
管道中有数据,读取数据,如果管道中没有数据,读管道的进程会阻塞
(2)写端不存在,读管道
管道中有数据,读取数据,如果管道中没有数据,读管道不阻塞立即返回
关于一些小技巧:
I.若你在vim中,打开了两个窗口,若想进行两个窗口的复制粘贴,则需要先将其分页(vsp)才可再用y 和 p
II.在Vim中,如果按d就表示剪切,之后按p进行粘贴。
III.在Vim中,u是撤销,ctrl + r 是撤销的撤销(恢复)
关注微信公众号获取更多资讯
相关文章推荐
- Linux网络编程之二
- Linux网络编程之一
- HTTP状态码
- 在ArcGIS中发布GoogleEarth瓦片为网络地图服务(wms)
- java中接口的定义与实现 http://blog.csdn.net/yjkwf/article/details/7238847
- RTP,RTCP,RTSP等网络协议有何用途和区别
- 基于mjpg-streamer网络视频服务器移植
- 《深入理解Linux网络技术内幕》阅读笔记(二十二)
- 关于 HTTP GET/POST 请求参数长度最大值的一个理解误区
- 解析虚拟VMware三种网络模式的根本区别
- C++接口实现总结 http://qimo601.iteye.com/blog/1393427
- http://www.google.com/ncr 谷歌无限制搜索方法,用过都说好
- tomcat+jdk的keytool生成证书 配置https
- TCP、UDP、IP 协议分析
- 网络流量监控命令-iftop
- https原理
- HttpClient_4 用法 由HttpClient_3 升级到 HttpClient_4 必看
- HttpClient 教程 (六)
- HttpClient 教程 (五)
- HttpClient 教程 (四)