连接子例程

用途

连接两个套接字。

标准 C 库 (libc.a)

语法

#include <sys/socket.h>

int connect ( Socket, Name, NameLength )  
int Socket; 
const struct sockaddr *Name;
socklen_t NameLength;

描述

connect 子程序请求在两个套接字之间建立连接。 内核设置套接字之间的通信链路; 两个套接字必须使用相同的地址格式和协议。

如果在未绑定或部分绑定的套接字上发出 connect 子程序,系统会自动绑定该套接字。 部分绑定插座是指分配了端口号但没有IP地址的插座。 connect 子程序可用于将一个套接字连接到自身。 一个插座可以通过绑定本地端口(使用 bind 子程序)并与具有本地IP地址的同一端口连接(使用 connect 子程序)来连接到自身。

connect 子程序对以下两种启动套接字分别执行不同的操作:

  • 如果初始化套接字为 SOCK_DGRAM ,则 connect 子程序将建立对等地址。 对等地址标识了后续子程序中所有数据报发送的套接字。 send子程序。 此 connect 子程序不会建立任何连接。 如果在调用 connect 子程序时,UDP套接字正在接收数据报,则该子程序会更改IP地址,防止套接字根据之前的地址接收数据报。
  • 如果启动套接字为 SOCK_STREAMSOCK_CONN_DGRAM ,则 connect 子程序将尝试与 Name 参数指定的套接字建立连接。 每个交流空间对名称参数的解释各不相同。 对于SOCK_CONN_DGRAM套接字类型和ATM协议,远程站可能会修改一些ATM参数。 如果远程站修改了ATM参数,应用程序可能会使用适当的套接字选项查询ATM参数的新值。
  • 对于 UNIX 域套接字 ,只有当调用 connect 子例程的进程对 bind 调用创建的套接字文件具有读写权限时, connect 调用才能成功。 权限由 umask 值决定,该值是创建文件的进程的值。

参数

描述
套接字 指定套接字的唯一名称。
名称 指定构成通信线路另一端的目标套接字的地址
NameLength 指定地址结构的长度。

返回值

成功完成后, connect 子程序返回0。

如果 connect 子程序执行失败,系统处理程序将执行以下功能:

  • 向调用程序返回-1。
  • 将错误代码(指示具体错误)移动到 errno 全局变量中。

错误代码

如果出现以下错误,则 connect 子程序将无法成功运行:

描述
EADDRINUSE 指定的地址已在使用中。 如果设置了SO_REUSEADDR套接字选项,并且本地地址(无论是系统指定的还是选择的)已被占用,也会出现此错误。
EADDRNOTAVAIL 指定的地址在本地机器上不可用。
EAFNOSUPPORT 指定地址系列中的地址不能与此套接字一起使用。
该插座带有 O_NONBLOCKO_NDLAY 标志,且之前的连接尝试尚未完成。
EINTR 试图建立连接的尝试因接收到的信号而中断。 连接是异步建立的。
EACCES 拒绝对路径前缀的组件的搜索许可权,或者拒绝对指定套接字的写访问权。
ENOBUFS 系统耗尽了内部数据结构的内存。
EOPNOTSUPP Socket参数引用的套接字不支持 connect
EWOULDBLOCK 分配给TCP/UDP临时端口的范围已耗尽。
EBADF Socket 参数无效。
生态环境 已拒绝尝试连接。
Efault Address 参数不在用户地址空间的可写部分中。
互联网络促进 套接字标记为非分块。 无法立即完成连接。 应用程序可以在连接过程中选择要写入的套接字。
EINVAL 在以下情况下会出现此错误:
  • 指定的路径名包含具有高位位集的字符。
  • 如果之前调用 connect 子程序失败。 在这种情况下,请关闭并重新打开处于错误状态的插座,然后重新尝试调用 connect 子程序。
EISCONN 套接字已连接。
ENETDOWN 指定的物理网络已关闭。
ENETUNREACH 不存在到网络或主机的路由。
ENOSPC 设备或系统桌面上没有剩余空间。
ENOTCONN 插座可能未连接。
ENOTSOCK Socket 参数引用文件,而不是套接字。
ETIMEDOUT 建立连接之前已超时。
E原型 指定的地址与绑定到指定对等地址的套接字具有不同的类型。
ELOOP 在转换地址中的路径名称时,遇到了太多符号链接。
ENOENT 路径名的组件未命名现有文件,或者路径名为空字符串。
ENOTDIR 地址中路径名称的前缀部分不是目录。

示例

以下程序片段演示了客户端使用 connect 子程序启动与服务器套接字连接的过程。

struct sockaddr_un server;
.
.
.
connect(s,(struct sockaddr*)&server, sun_len(&server));