WEB开发网
开发学院软件开发VC BSD socket 阅读

BSD socket

 2006-08-09 22:57:07 来源:WEB开发网   
核心提示: 连接关闭soclose()当对一个连向 socket 的 fd 进行 close(2) 操作时, 会调用 soclose() 例程, 关闭与撤消 socket 相关的机制. 首先, 如果这是一个 server 端的 socket, 它就会有等待 accept 的 socket, 我们要把它

连接关闭

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.

上一页  1 2 3 4 5 6 7  下一页

Tags:BSD socket

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接