《TCP/IP网络编程》第12章 笔记&代码&注释

本人常用环境是WINDOWS,因此暂时略读根据书上提示跳过10、11章进行笔记:

Windows相较于Linux,多进程服务器并不适用,10~11章重点放在Linux平台。

复用

在一个通信频道中传递多个数据(信号)的技术。

为了提高物理设备的效率,利用最少的物理要素传递最多的数据使用的技术。

I/O复用服务器端

类比成课堂:1位老师服务多位学生;只有当(客户端)学生举手提问,老师才会在收到举手的信息(收到数据的套接字)后回答问题。也就是现在的教室以I/O复用方式运行。

select()函数

//Window
int select(int maxfd,fd_set* cprReads,fd_set* writeset,fd_set* readset,fd_set* timeout)
/*
在windows中,maxfd 并无意义,只是为了其他平台系统的兼容性,因此传0
readset 关注“是否存在待读取数据”
writeset 关注“是否可传输无阻塞数据”
timeout 关注“超时信息(time-out)”

实际使用我们根据需要关注的功能进行传参,其他情况传0。
*/

select()函数可以将多个文件描述符集中到一起统一监视,监视项目:

  • 是否存在套接字接收数据?
  • 无需阻塞传输数据的套接字有哪些?
  • 哪些套接字发生了异常?

调用方法和顺序

  1. 设置文件描述符→指定监视范围→设置超时
  2. 调用select函数
  3. 查看调用结果

一共三个步骤。

利用fd_set数组变量对文件描述符进行监视,数组下标位置为该文件描述符所在位置,该位置为1,则表示该对象为监视对象,0则相反。

利用宏完成对fd_set变量中注册或更改值的操作:(Linux与Windows一致)

  • FD_ZERO(fd_set * fdset) fd_set所有位置初始化为0
  • FD_SET(int fd, fd_set * fdset) 在fdset指向变量中注册描述符fd的信息
  • FD_CLR(int fd, fd_set * fdset) 在fdset指向变量中清除描述符fd的信息
  • FD_ISSET(int fd, fd_set * fdset) 若fdset指向变量中包含注册描述符fd的信息,则返回真

代码:(含注释 Windows)

https://github.com/ChristmasError/TCP-IP-Network-programming/tree/master/%E7%AC%AC%E5%8D%81%E4%BA%8C%E7%AB%A0%20IO%E5%A4%8D%E7%94%A8

为了效果,你可以同时开多几个客户端进行测试。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章