编程接口指南

建立连接

通常以非对称形式建立连接,一个进程用作客户机,而另一个进程则用作服务器。服务器将套接字绑定到与服务关联的已知地址,并阻塞在套接字上等待连接请求。然后,不相关的进程便可连接到此服务器。客户机通过启动到服务器套接字的连接,向服务器请求服务。在客户端,connect(3SOCKET) 调用启动连接。在 Internet 系列中,此连接可能如下所示:

struct sockaddr_in6 server;

 ...

connect(s, (struct sockaddr *)&server, sizeof server);

如果在连接调用期间未绑定客户机的套接字,则系统会自动选择一个名称并将其绑定到套接字。有关更多信息,请参见地址绑定。这种自动选择是将本地地址绑定到客户端上套接字的常规方法。

要接收客户机的连接,服务器必须在绑定其套接字之后执行两个步骤。第一步是说明可以排队多少连接请求。第二步接受连接。

struct sockaddr_in6 from;

 ...

listen(s, 5);                /* Allow queue of 5 connections */

fromlen = sizeof(from);

newsock = accept(s, (struct sockaddr *) &from, &fromlen);

套接字句柄 s 是绑定到连接请求要发送到的地址的套接字。listen(3SOCKET) 的第二个参数指定可以对其进行排队的最大未完成连接数。from 结构使用客户机的地址进行填充。可能传递 NULL 指针。fromlen 为此结构的长度。

通常,accept(3SOCKET) 例程阻塞进程。accept(3SOCKET) 返回一个连接到请求客户机的新套接字描述符。fromlen 的值将更改为此地址的实际大小。

服务器无法指示其只接受来自特定地址的连接。服务器可以检查由 accept(3SOCKET) 返回的 from 地址并关闭与不可接受的客户机之间的连接。服务器可以接受多个套接字上的连接,或者避免在调用 accept(3SOCKET) 时阻塞。高级套接字主题中介绍了这些技术。