网络编程:Socket API

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时,协议时通过以下两个参数共同指定的:

  1. 协议簇

  2. 服务类型

    例如,有序可靠的字节流(SOCK_STREAM)、不可靠的数据报(SOCK_DGRAM)等

  • 地址簇

地址簇定义地址的格式、表达地址的字节大小,以及它所包含的字段的数量、类型、顺序等。

地址簇还定义了一组解释地址的函数,它有诸如确定IP数据报将要到达的子网等等功能。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容