个人生活学习随笔日记
UNP_18_路由套接字
18.1 概述
内核中的 Unix 路由表传统上一直使用 ioctl 命令进行访问,但是没有 ioctl 命令可以获得所有路由表,相反,类似 netstat 等程序通过读取内核的内存获取路由表的内容。
- 进程可以通过写出到路由套接字而往内核发送消息。路径的增加和删除采用这种操作实现
- 进程可以通过从路由套接字读入而自内核接收消息。内核采用这种操作通知进程已收到并处理一个 ICMP 重定向消息,或者请求外部路由进程解析一个消息
- 进程可以使用 sysctl 函数获取所有路由表或所有已配置的接口
前两种操作需要超级用户权限,最后一种只需要普通用户权限
…UNP_17_ioctl操作
17.1 概述
ioctl 函数传统上一直作为那些不适合归入其他精细定义类别的特性的系统接口。POSIX 创造了一系列函数用来代替 icotl,但是它还是必不可少的。网络程序经常在程序启动后执行使用 ioctl 获取所在主机全部网络接口的信息:接口地址,是否支持广播,是否支持多播等等
…UNP_16_非阻塞式IO
16.1 概述
套接字的默认状态是阻塞的。这表示发出一个不能立即完成的套接字调用时,其进程会被投入睡眠,等待相应操作完成。可能阻塞的套接字调用可分为下面 4 种:
- 输入操作,包括 read,readv,recv,recvfrom 和 recvmsg 共 5 个函数。如果某个进程对一个阻塞的 TCP 套接字调用这些输入函数之一,并且缓冲区中没有数据可以读取,进程会进入休眠,知道数据到达。TCP 是字节流协议,该进程的唤醒只要一些数据,如果要设置固定的量,可以使用 readn 或者设置 MSG_WAITALL 标志。对于非阻塞的套接字,如果输入操作不被满足,调用会立即返回一个 EWOULDBLOCK 错误
- 输出操作,包括 write,writev,send,sendto 和 sendmsg 共 5 个函数,和输入类似。对于一个非阻塞的 TCP 套接字,如果发送缓冲区没有空间,输出函数调用将立即返回一个 EWOULDBLOCK 错误。
- 接受外来连接,即 accept 函数。如果对一个阻塞的套接字调用该 accept 函数,并且没有新的连接到达,调用进程将被投入睡眠。如果一个非阻塞的套接字调用 accept 函数,并且尚无新的连接到达,accept 调用将立即返回一个 EWOLULDBLOCK 错误。
- 发起外出连接,即用于 TCP 的 connect 函数。TCP 连接的建立涉及一个三路握手过程,而且 connect 函数一直要等到客户收到对于自己的 SYN 的 ACK 才会返回。这意味着 TCP 的每个 connect 总会阻塞其调用进程至少一个 RTT 时间。如果对一个非阻塞的 TCP 套接字调用 connect,并且连接不能立即建立,那么连接的建立能照样发起,不过会返回一个 EINPROGRESS 错误,注意这个错误和上面的错误并不相同。还需要注意同一主机上的连接会立即建立完成,通常发生在同一主机的情况下。因此对于非阻塞的 connect,我们也要预备 connect 成功返回的情况发生。