Socket API
1.OS IPC机制
OS提供的IPC机制一般分为两类:
-
本地IPC
只允许位于同一计算机上的实体之间通信的机制,如内存共享、管道、UNIX的socket、门、信号等。
-
远程IPC
循序配置或分布在一个网络上的实体之间通信的机制,如Internet领域socket、X。25电路、win32命名管道。
2.Socket API
Socket和句柄
Socket API最初是在BSD UNIX中开发给TCP/IP协议簇提供应用程序接口的,后来被移植到大多数OS中。它是在TCP/IP上编写进程间通信的事实上的标准。
- 在应用程序中可以用Socket API中的函数来创建、管理本地通信端点,这些端点称为socket。
- 我们通过一个句柄(handle)访问一个socket:一个socket句柄可以标识出OS维护的一个通信端点,同时可以使程序不受OS内核实现细节的影响,即不依赖于OS底层细节。
- 每个socket可以绑定到一个本地地址和一个远程地址上,这些地址定义了两个或多个通过socket通信的对等实体(peers)之间的关系。
socket系统函数
Socket API有大约二十多个系统函数,可以分为五类:
(1)本地环境管理
这些函数用于管理本地环境信息,这些信息通常存储在OS内核或系统库中。
函数 | 作用 |
---|---|
socket() |
factory function,用于分配一个socket句柄并返回给调用者 |
bind() |
将一个socket句柄和一个本地或远程地址关联起来 |
getsockname() |
返回socket绑定的本地地址 |
getpeername() |
返回socket绑定的远程地址 |
close() |
释放socket句柄,使其可以复用 |
(2)连接的建立和终止
函数 | 作用 |
---|---|
connect() |
主动在一个socket句柄上建立连接 |
listen() |
表示愿意被动侦听来自客户的连接请求 |
accept() |
factory function,用于相应用户请求,创建一个新的连接 |
shutdown() |
有选择地终止双向连接中读取方和/或写入方地数据流 |
(3)数据传输机制
用于通过socket句柄发送和接收数据
函数 | 作用 |
---|---|
send() recv()
|
通过某一特定I/O句柄,传送和接收数据缓冲区 |
sendto() recvfrom()
|
交换无连接数据报。每一个sendto() 调用都要提供接收方的网络地址 |
(4)选项管理
这些函数允许程序员改变缺省的socket行为,从而支持多播和广播,并且能修改/查询传输缓冲区的大小。
函数 | 作用 |
---|---|
setsockopt |
在协议栈的不同层修改选项 |
getsockopt |
在协议栈的不同层查询选项 |
(5)网络地址
用来将具有可读性的名称解析为低级网络地址
函数 | 说明 |
---|---|
gethostbyname() gethostbyaddr()
|
处理主机名和IPv4之间的网络地址映射 |
getipnodebyname() getipnodebyaddr()
|
处理主机名和IPv4/IPv6地址之间的网络地址映射 |
getservbyname() |
通过具有可读性的名称来标识服务(service) |
3.通信领域的组成:协议簇与地址簇
Socket API常用来编写TCP/IP应用程序,但它也可以广泛支持多个通信领域。
一个通信领域由一个协议簇和一个地址簇确定。
- 协议簇
一个协议簇是一个协议集合,用来提供一组特定的相关服务。在通过Socket API创建socket时,协议时通过以下两个参数共同指定的:
-
协议簇
-
服务类型
例如,有序可靠的字节流(SOCK_STREAM)、不可靠的数据报(SOCK_DGRAM)等
- 地址簇
地址簇定义地址的格式、表达地址的字节大小,以及它所包含的字段的数量、类型、顺序等。
地址簇还定义了一组解释地址的函数,它有诸如确定IP数据报将要到达的子网等等功能。
网友评论