Posted on 2009-12-21 21:14
silentneil 阅读(1021)
评论(0) 编辑 收藏 引用 所属分类:
通讯 、
ACE
socket接口最初是在BSD UNIX中开发的,用以提供TCP/IP协议组的接口。从应用的视点来看,socket是本地的通信端点,与驻留在本地或远地的地址绑定在一起。socket可通过句柄(也称为描述符)来访问。
在UNIX中,socket句柄与其他句柄共享同一个名字空间,例如,文件、管道和终端设备句柄。句柄提供一种封装机制,降应用与内部的OS数据结构的知识平屏蔽开。句柄标识特定的由OS维护的通信端点。
socket接口大致有:socket(), bind(), connect(), accept(), read(), write(), readv(), writev(), recv(), send(), recvfrom(), sendto(), recvmsg(), sendmsg(), setsockopt(), getsocketopt(), getpeername(), getsockname(), gethostbyname(), getservbyname()。可分为以下类型:
本地管理:socket接口为管理本地上下文信息提供以下函数:
--socket:分配最小的未用的socket句柄;
--bind:讲socket句柄与本地或远地地址相关联;
--getsockname和getpeername:分别确定socket所连接的本地或远地地址;
--close:释放socket句柄,使它可用于后面的复用。
连接建立和连接终止:socket接口为建立和终止连接提供以下函数:
--connect:客户端常使用connect来主动地与服务器建立连接;
--listen:服务器使用listen来指示它想要被动地侦听进入的客户连接请求;
--accept:服务器使用accept来创建新的通信端点,以为客户服务;
--shutdown:有选择地终止一个双向连接的读端和/或写端流。
数据传输机制:socket接口提供以下函数来发送和接收数据:
--read/write:通过特定句柄接收和传输数据缓冲区;
--send/recv:与read/write类似,但它们提供一个额外的参数来控制特定的socket特有操作(比如交换“紧急”数据,或“偷看”接收队列中的数据,而又不把它从队列中移除);
--sendto/recvfrom:交换无连接数据报;
--readv/writev:分别支持“分散读”和“集中写”语义(这些操作优化用户/内核模式切换并简化内存管理);
--sendmsg/recvmsg:通用函数,包含了所有其他数据传输函数的行为。对于UNIX域的socket,sendmsg和recvmsg函数还提供在同一主机的任意进程间传递“访问权限”(比如打开文件句柄)的能力。
注意这些接口也可被用于其他类型的I/O,比如文件和终端。
选项(option)管理:socket接口定义以下函数,允许用户改变socket行为的缺省语义:
--setsockopt和getsockopt:修改或查询在协议栈不同层次的选项。选项包括多点传送、广播,以及设置/获取发送和接收传输缓冲区的大小;
--fcntl和ioctl:是UNIX系统调用,使在socket上能够进行异步I/O、非阻塞I/O,以及紧急消息传递。
除了上面描述的socket函数,通信软件还可使用以下标准库函数和系统调用:
--gethostbyname和gethostbyaddr:处理网络寻址的多种情况,比如映射主机名到IP地址;
--getservbyname:通过服务的端口号或人类可读的名字来对它们进行标识;
--ntohl、ntohs、htonl、htons:执行网络字节序转换;
--select:在成组的打开的句柄上执行基于I/O和基于定时器的事件多路分离。
参考自:ACE技术论文集