连接子例程
用途
连接两个套接字。
库
标准 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_STREAM 或 SOCK_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_NONBLOCK 或 O_NDLAY 标志,且之前的连接尝试尚未完成。 |
| EINTR | 试图建立连接的尝试因接收到的信号而中断。 连接是异步建立的。 |
| EACCES | 拒绝对路径前缀的组件的搜索许可权,或者拒绝对指定套接字的写访问权。 |
| ENOBUFS | 系统耗尽了内部数据结构的内存。 |
| EOPNOTSUPP | Socket参数引用的套接字不支持 connect 。 |
| EWOULDBLOCK | 分配给TCP/UDP临时端口的范围已耗尽。 |
| EBADF | Socket 参数无效。 |
| 生态环境 | 已拒绝尝试连接。 |
| Efault | Address 参数不在用户地址空间的可写部分中。 |
| 互联网络促进 | 套接字标记为非分块。 无法立即完成连接。 应用程序可以在连接过程中选择要写入的套接字。 |
| EINVAL | 在以下情况下会出现此错误:
|
| 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));