什么是套接字?
套接字允许同一台或不同机器上的两个不同进程之间进行通信。更准确地说,它是一种使用标准 Unix 文件描述符与其他计算机通信的方式。在 Unix 中,每个 I/O 操作都是通过写入或读取文件描述符来完成的。文件描述符只是与打开的文件相关联的整数,它可以是网络连接、文本文件、终端或其他内容。
对于程序员来说,套接字的外观和行为与低级文件描述符非常相似。这是因为 read() 和 write() 等命令处理套接字的方式与处理文件和管道的方式相同。
套接字最初是在 2.1BSD 中引入的,随后在 4.2BSD 中完善为当前形式。现在,大多数最新 UNIX 系统版本都提供套接字功能。
套接字用于何处?
Unix 套接字用于客户端-服务器应用程序框架。服务器是根据客户端的请求执行某些功能的进程。大多数应用程序级协议(如 FTP、SMTP 和 POP3)都使用套接字在客户端和服务器之间建立连接,然后交换数据。
套接字类型
有四种类型的套接字可供用户使用。前两种最常用,后两种很少使用。
进程被认为只能在相同类型的套接字之间进行通信,但没有限制阻止不同类型的套接字之间的通信。
流套接字 − 保证在网络环境中进行交付。如果您通过流套接字发送三个项目"A、B、C",它们将以相同的顺序 − "A、B、C"到达。这些套接字使用 TCP(传输控制协议)进行数据传输。如果无法交付,发送方将收到错误指示。数据记录没有任何边界。
数据报套接字 − 在网络环境中的交付无法保证。它们是无连接的,因为您不需要像在流套接字中那样建立开放连接 − 您使用目标信息构建数据包并将其发送出去。它们使用 UDP(用户数据报协议)。
原始套接字 − 这些为用户提供对支持套接字抽象的底层通信协议的访问。这些套接字通常是面向数据报的,但它们的确切特性取决于协议提供的接口。原始套接字不适用于一般用户;它们主要面向那些有兴趣开发新通信协议或访问现有协议中一些更隐秘功能的人。
顺序数据包套接字 − 它们类似于流套接字,不同之处在于记录边界得以保留。此接口仅作为网络系统 (NS) 套接字抽象的一部分提供,在大多数严肃的 NS 应用程序中非常重要。顺序数据包套接字允许用户操作数据包或一组数据包上的顺序数据包协议 (SPP) 或 Internet 数据报协议 (IDP) 标头,方法是编写原型标头以及要发送的任何数据,或者指定要与所有传出数据一起使用的默认标头,并允许用户接收传入数据包上的标头。
下一步是什么?
接下来的几章旨在加强您的基础知识,并在您使用 套接字 编写服务器和客户端程序之前打下基础。如果您想直接跳转到如何编写客户端和服务器程序,那么您可以这样做,但不建议这样做。强烈建议您逐步完成这前几章,以打好基础,然后再继续进行编程。