2024年3月24日发(作者:)

相信各位读者现在对於 Winsock 的定义、系统环境,以及一些 Winsock Stack

及 Winsock 应用程式,都有基本的认识了。接下来笔者希望能分几期为各位读者

介绍一下简单的 Winsock 网路应用程式设计。

我们将以 Winsock 1.1 规格所定义的 46 个应用程式介面(API)为基础,逐

步来建立一对 TCP socket 主从架构(Client / Server)的程式。在这两个程式

中,Server 将使用 Winsock 提供的「非同步」(asynchronous)函式来建立 s

ocket 连结、关闭、及资料收送等等;而 Client 则采类似传统 UNIX 的「阻拦

式」(blocking)。由於我们的重点并不在於 MS Windows SDK 的程式设计,所

以我们将使用最简便的方式来显示讯息;有关 MS Windows 程式的技巧,请各位

读者自行研究相关的书籍及文章。

今天我们先要看一下主从架构 TCP socket 的建立连结(connect)及关闭

(close)。

以前笔者曾简单地介绍过主从架构的概念,现在我们再以生活上更浅显的例

子来说明一下,读者稍後也较容易能明白笔者的叙述。我们可以假设 Server 就

像是电信局所提供的一些服务,比如「104 查号台」或「112 障碍台」。

(1)电信局先建立好了一个电话总机,这就像是呼叫 socket() 函式开启了一

个 socket。

(2)接著电信局将这个总机的号码定为 104,就如同我们呼叫 bind() 函式,

将 Server 的这个 socket 指定(bind)在某一个 port。当然电信局必须让用户

知道这个号码;而我们的 Client 程式同样也要知道 Server 所用的 port,待会

才有办法与之连接。

(3)电信局的 104 查号台底下会有一些自动服务的分机,但是它的数量是有

限的,所以有时你会拨不通这个号码(忙线)。同样地,我们在建立一个 TCP 的

Server socket 时,也会呼叫 listen() 函式来监听等待;listen() 的第二个

参数即是 waiting queue 的数目,通常数值是由 1 到 5。(事实上这两者还是

有点不一