BSD socket
2006-08-09 22:57:07 来源:WEB开发网连接关闭
soclose()
当对一个连向 socket 的 fd 进行 close(2) 操作时, 会调用 soclose() 例程, 关闭与撤消 socket 相关的机制.
首先, 如果这是一个 server 端的 socket, 它就会有等待 accept 的 socket, 我们要把它关掉. 因为这些连接在 server socket 被关闭后我们不可能通过 accept(2) 或其他任何手段来获取和使用它们. 接着, 我们需要用 sodisconnect() 去关闭对端连接, 我们可能还要确认对端关闭, 即在 583 行处等待连接真正被关闭.
完成关闭工作后, 我们要把相关的数据结构撤消. 方法是首先用 PRU_DETACH 操作通知底层协议实现取消 socket, 然后用 sofree() 将 struct socket 撤消.
我们再来看 sodisconnect(), 这是一个简单的函数. 在检验 socket 状态后, 它向底层协议实现调用 disconnect 操作. 然后使用 sodopendfree 撤消相应的 mbuf 链.
shutdown(2)
shutdown(2) 能够实现 socket 的半关闭功能. sys_shutdown() 直接调用了 soshutdown(). 在这里, 如果我们关闭的是读一端, 它就要调用 sorflush() 在这里, socket 被标记为不再接受数据, 并清空其接收端的 sockbuf, 这之中的 socantrcvmore() 除了标记状态之外, 还要将等待读的进程唤醒, 因为它们不可能再因读到数据而被唤醒了. 另一方面, 如果是关闭写一端, 就要通过协议实现作相应的处理, 通知对方等.
BSD 本地进程间通讯: 本地 socket
socket 是作为一种进程间通讯机制而非网络通讯机制出现在 BSD UNIX 中的 . 所以, 我们选择了一个底层协议实现: 本地 socket, (AF_UNIX, PF_LOCAL, etc.) 来分析, 作为本章的结束. 我们选择了它以 STREAM 方式运行的环境进行分析. 常用网络协议中与之对应的是 TCP.
更多精彩
赞助商链接