风雨兼程

ring my bells
posts - 49, comments - 14, trackbacks - 0, articles - 0

socket接口

Posted on 2009-12-21 21:14 silentneil 阅读(996) 评论(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技术论文集



只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理