您的位置:首页 > 理论基础 > 计算机网络

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 是撤销的撤销(恢复)

关注微信公众号获取更多资讯



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: