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

BSD socket

 2006-08-09 22:57:07 来源:WEB开发网   
核心提示: 该协议实现的入口在 uipc_usrreq.c: uipc_usrreq(), 在这里请求经过初步处理后, 在根据要求的操作进入到 unp_xxx() 函数进行处理. 分析它们, 最好先回去看 socket 部分相应操作的实现, 了解协议实现中相应部分的地位和任务 . 其操作就很好懂了.

该协议实现的入口在 uipc_usrreq.c: uipc_usrreq(), 在这里请求经过初步处理后, 在根据要求的操作进入到 unp_xxx() 函数进行处理. 分析它们, 最好先回去看 socket 部分相应操作的实现, 了解协议实现中相应部分的地位和任务 . 其操作就很好懂了.

连接建立

socket(2) 会使用 PRU_ATTACH 操作, 进入 unp_attch() 例程. 在这里, 我们要做的事情是利用 soreserve 设定缓冲区大小等信息, 然后分配并设定自己的协议控制块 unp.

bind(2) 使用 PRU_BIND 进入 unp_bind() 例程. 我们根据参数 (这里的地址其实就是 socket 的文件路径) 去创建相应的文件, 并设置自己的参数即可.

listen(2) 在协议实现上除了参数检验, 什么也不用做. 文件都创建了放在那里 , 也没有其他事情要干了.

accept(2) 调用 PRU_ACCEPT, 是为了获得对端地址. 因此其处理例程很简单, 将其地址在协议控制块中复制出来就可以了. 接着就是要设置已连接标志即可.

我们来看 connect(2) 的操作 unp_connect(). 我们首先找到 server 端对应的 socket 文件, 并从中提取出对端 socket so2, 这个 so2 是在 listen 的 socket, 我们在这里新建一个 socket so3, 把 so2 的地址复制出来, 于是 so3 就是用于和 so 点对点通信的 socket 了. 现在我们可以调用 unp_connect2() 完成连接过程, 我们只看其 STREAM 实现部分. 在这里, 我们把自己的协议控制块 (unp) 的地址放到对端的的 unp_conn 域中, 联系上文 accept 的做法, server 端就能取得对应的 socket 并连接了. 这一切的 "连接" 都是在本地的内核空间中完成, 所以特别简单. 我们再设置两者的连接状态即可完成.

数据传输

当 socket 数据传输到了协议实现层, 我们要做的只是把封装成 mbuf 的数据加上自己的头部 (如 TCP 头), 发送出去而已. 我们来看本地 socket 在这方面的实现.

sosend() 会使用 PRU_SEND 操作. 取得对端 socket 后, 我们什么都不用干, 直接往它的读缓冲灌数据就可以了, 不用通过其他任何媒介. 下面的工作就是唤醒对端进程. 而 PRU_RCVD 的操作也很好理解, 数据已经放在了缓冲区, 它不必去动, 只要相应地维护一些size 的参数就可以. 然后也是唤醒对端进程.

连接关闭

略了. 就是一些状态的设定而已.

参考文献

  • TCP/IP Illustrated, Vol 2. The Implementation
  • The Design and Implementation of the 4.4BSD Operating System

上一页  2 3 4 5 6 7 

Tags:BSD socket

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