02 月 26 日
我从未想到过,终有一天我会写一份文档,介绍如何用 C 编写网络程序,原因是这么多年了,我从未学会网络编程。也许自从国内计算机专家将 socket 这个英文单词翻译「套接字」的时候,似乎已经注定了我很难学会它。
网络编程,无论理论家们是如何阐述它的,但在现实中,它就是面向套接字的编程。
何为套接字?socket 的这个单词的本意是窝、臼、槽、插座、插口等,至于它的「套接字」这个翻译,我不喜欢,但是在已形成世俗的力量面前,我也没有力量推翻它。在网络编程中,套接字表示通信的端点,它拥有一个地址,由计算机的 IP 地址和端口号组合而成的地址,例如
192.168.0.10:8080
冒号之前的部分是 IP 地址,例如 192.168.0.10,之后的部分是端口号,例如 8080。套接字的用途是,计算机的操作系统可基于它为某个进程与另一台计算机上的某个进程建立信息传输通道。
何谓进程?进程就是活着的程序,亦即计算机中正在运行的程序。当问题复杂到很难通过一个程序予以解决,我们便不得不考虑通过两个甚至更多个程序协同解决。这些参与解决同一个复杂问题的多个程序,它们未必是在同一台计算机上运行,它们需要基于某种通信网络实现通信,基于信息交流实现协同工作。
我们需要建立一种直觉,即所谓网络通信,指的是某台计算机或两台不同的计算机上的两个进程之间的通信。这两个进程,皆需具备发送和接受信息的能力,否则无法完成能够实现二者协同工作的通信。这种通信方式,与我们往日书信交流有相似之处。我们每个人,都具备写信和收信的能力,不是吗?
在计算机网络中,常用的一种通信形式是,很多台计算机中的进程,主动向某台计算机中的进程发送信息,并接受后者回复的信息,我们称前者为客户端(client),后者为服务端(server)。在现实生活中,服务端像是一个明星级的人物,有许多喜欢他的人会给他写信,至于他是否能逐一回信,我就不清楚了。计算机网络中的服务端会尽最大努力做到逐一回信,甚至不惜为此事创建一个团队以提高回信速度。像这样的网络程序,通常称为 C/S 架构,亦即客户端/服务端架构。
进程之间基于套接字的通信,使得进程可以是异构的。例如,一个进程,可以是 C 语言写的,而另一个可以是 Java 语言写的,只要它们都遵守基于套接字通信这个约定,便能够实现通信。当存在不计其数的进程进行通信,便形成了互联网。