-
最新日志
存档页
分类
功能
Category Archives: Network学习笔记
TCP Echo Server(select)
到现在,我Unix,数据库的扫盲基本完成了,就差网络这一块了。从今天开始网络扫盲。上周五开始看HTTPD的实现,我们的httpd是AA(AA是我们SBE的元老之一)开发的,只要是AA开发的东西,学习一遍都很有收获。因为AA是一位非常优秀的架构师,而且自己写过很多代码。 上周五开林和徐辰已经跟我讲过一篇大概的流程了,可我直接看代码还是有点吃力。于是我下载了<Unix Network Programming– Volume1: The Sockets Networking API>, 周末翻一一些,看到下面这些图示,觉得很清楚,在这里抄袭一遍。 这里用的是select实现:int select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset, const struct timeval *timeout);大概的意思就是select会检查ID从0到maxfdp1-1的句柄(我们可以把句柄理解成一个打开的I/O设备),我们事先在readset/writeset/exceptset中把自己感兴趣的I/O操作置位。select调用会逐一检查看看有没有任何我们感兴趣的I/O发生,如果在句柄ID=4对应的点有数据到达,就会把readset中的第4位 bit置1…如果所有感兴趣的句柄上都没有I/O发生,select会阻塞等待(timeout==NULL)。当select返回的时候,程序只要检查readset/writeset就可以知道是哪个句柄上发生了什么操作了。 这里注意一点readset/writeset/exceptset都是传入的指针,程序员手动将自己感兴趣的I/O bit置位。但是select会改动那些bit位。所以每次调用select之前,我们都要重新这些set赋值 上面左图是server上还没有链接建立前的状态,server打开了一个socket句柄正在监听一个端口。中图表示程序维护了一个句柄数组client[FD_SETSIZE]用来记录所有成功建立链接的socket句柄,数组的长度也就限定了程序能够建立链接的上限,开始我们把所有的数组元素全部初始化成-1,表示这个位置可用,当连接建立以后可以在值为-1的位置填入真正的句柄ID。如果我们是在forground启动server的话,句柄0,1,2已经被预留成标准输入,标准输出和标准错误输出,所以listen句柄ID=3。rset=readset–将第3个bit置1。 maxfd = listenfd; //listenfd是打开的监听句柄maxi = -1; //maxi表示在client数组中ID最大的链接句柄的位置,开始的时候没有链接,所以maxi=-1for (i = 0; i < FD_SETSIZE; … 繼續閱讀
发表在 Network学习笔记
1条评论