什么是socket?

socket的原意是“插座”,在计算机通信领域,socket被翻译成“套接字”,它是计算机之间进行通信的一种约定或一种方式。
通过socket这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据。

把充电器插头插到插座上就能从电网获取电力供应给手机充电,同样的,为了与远程计算机进行数据传输,需要连接到互联网,而
socket就是用来连接到互联网的工具。

socket的典型应用就是Web服务器和浏览器:浏览器获取用户输入的URL,向服务器发起请求,服务器分析接收到的URL,将对应的网页的内容
返回给浏览器,浏览器再经过解析和渲染,就将文字、图片、视频等元素呈现给用户。

UNIX/Linux中的socket是什么?

在UNIX/Linux系统中,为了统一对各种硬件的操作,简化接口,不同的硬件设备也都被看成一个文件。对这些文件的操作,等同于对磁盘上普通文件
的操作。

UNIX/Linux中的一切都是文件

为了表示和区分已经打开的文件,UNIX/Linux会给每个文件分配一个ID,这个ID就是一个整数,被称为文件描述符。例如:

  • 通常用0来表示标准输入文件(stdin),它对应的硬件设备就是键盘;
  • 通常用1来表示标准输出文件(stdout),它对应的硬件设备就是显示器。

UNIX/Linux程序在执行任何形式的I/O操作时,都是在读取或写入一个文件描述符。一个文件描述符只是一个和打开的文件相关联的整数,它的背后可能
是一个硬盘上的普通文件、FIFO、管道,终端键盘、显示器,甚至是一个网络连接。

网络链接也是一个文件,它也有文件描述符!

我们可以通过socket()函数来创建一个网络连接,或者说打开一个网络文件,socket()的返回值就是文件描述符。有了文件描述符,我们就可以使用普通的文件操作函数来传输数据了,例如:

  • 用read()读取从远程计算机传来的数据
  • 用write()向远程计算机写入数据。

Windows系统中的socket是什么?

Windows也有类似“文件描述符”的概念,但通常被称为“文件句柄”。与UNIX/Linux不同的是,Windows会区分socket和文件,Windows就把socket当作一个网络链接来对待,因此需要调用专门针对
socket而设计的数据传输函数,针对普通文件的输入输出函数就无效了。