BLAB:服务器连接网络四部曲

为了与外界沟通,C程序用数据流读写字节。到目前为止,你用过三种数据流,它们分别连接的是文件、标准输入和标准输出。如果想要写一个与网络通信的程序,就需要一种新数据流——套接字。

BLAB:服务器连接网络四部曲 - 图1

在使用套接字与客户端程序通信前,服务器需要历经四个阶段:绑定(Bind)、监听(Listen)、接受(Accept)和开始(Begin),首字母缩写为BLAB。

BLAB:服务器连接网络四部曲 - 图2

1. 绑定端口

计算机可能同时运行多个服务器程序:一个发送网页,一个发送邮件,另一个运行聊天服务器。为了防止不同对话发生混淆,每项服务必须使用不同的端口(port)。端口就好比电视频道,我们在不同端口使用不同的网络服务,就像我们通过不同频道收看不同的电视节目。

BLAB:服务器连接网络四部曲 - 图3

服务器在启动时,需要告诉操作系统将要使用哪个端口,这个过程叫端口绑定。knock-knock服务器将使用30000端口,为了绑定它,你需要两样东西:套接字描述符和套接字名。套接字名是一个表示“互联网30000端口”的结构。

BLAB:服务器连接网络四部曲 - 图4

2. 监听

如果你的笑话服务器出了名,可能会有很多客户端同时连接它。想让客户端排队等待连接吗?可以用listen()系统调用告诉操作系统你希望队列有多长。

BLAB:服务器连接网络四部曲 - 图5

调用listen()把队列长度设为10,也就是说最多可以有10个客户端同时尝试连接服务器,它们不会立即得到响应,但可以排队等待,而第11个客户端会被告知服务器太忙。

BLAB:服务器连接网络四部曲 - 图6

3. 接受连接

一旦绑定完端口,设置完监听队列,唯一可以做的就是等待。服务器一生都在等待有客户端来连接它们。accept()系统调用会一直等待,直到有客户端连接服务器时,它会返回第二个套接字描述符,然后就可以用它通信了。

BLAB:服务器连接网络四部曲 - 图7

服务器将用新的连接描述符connect_d……

BLAB:服务器连接网络四部曲 - 图8

BLAB:服务器连接网络四部曲 - 图9脑力练习

为什么accept()系统调用要创建一个新的套接字描述符?服务器为什么不用监听端口的那个套接字通信?