connect(2) - Linux 手册页
名称
connect - 在套接字上发起连接概要
#include <sys/types.h> /* See NOTES */ #include <sys/socket.h> int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
描述
如果套接字 sockfd 的类型为 SOCK_DGRAM,则 addr 是默认发送数据报的目的地址,也是接收数据报的唯一地址。如果套接字类型为 SOCK_STREAM 或 SOCK_SEQPACKET,则此调用尝试连接到绑定到 addr 指定地址的套接字。
通常,基于连接的协议套接字可能只成功 connect() 一次;无连接协议套接字可以使用 connect() 多次来更改其关联。无连接套接字可以通过连接到 sockaddr 的 sa_family 成员设置为 AF_UNSPEC 的地址来解除关联(Linux 内核 2.2 及更高版本支持)。
返回值
如果连接或绑定成功,则返回零。发生错误时,返回 -1,并且 errno 被设置为适当的值。错误
以下是通用的套接字错误。可能还有其他特定于域的错误代码。- EACCES
- 对于由路径名标识的 UNIX 域套接字:拒绝对套接字文件的写入权限,或者拒绝对路径前缀中的某个目录的搜索权限。(另请参阅 path_resolution(7)。)
- EACCES, EPERM
- 用户尝试连接到广播地址,但未启用套接字广播标志,或者由于本地防火墙规则导致连接请求失败。
- EADDRINUSE
- 本地地址已在使用中。
- EAFNOSUPPORT
- 传递的地址在其 sa_family 字段中没有正确的地址族。
- EAGAIN
- 没有更多的空闲本地端口或路由缓存中的条目不足。对于 AF_INET,请参阅 /proc/sys/net/ipv4/ip_local_port_range ip(7) 的描述,了解如何增加本地端口的数量。
- EALREADY
- 套接字是非阻塞的,并且之前的连接尝试尚未完成。
- EBADF
- 文件描述符不是描述符表中的有效索引。
- ECONNREFUSED
- 远程地址上没有人监听。
- EFAULT
- 套接字结构地址超出用户的地址空间。
- EINPROGRESS
- 套接字是非阻塞的,并且无法立即完成连接。可以通过选择套接字进行写入来使用 select(2) 或 poll(2) 来完成。在 select(2) 指示可写性之后,使用 getsockopt(2) 在 SOL_SOCKET 级别读取 SO_ERROR 选项,以确定 connect() 是否成功完成(SO_ERROR 为零)或失败(SO_ERROR 是此处列出的通常错误代码之一,解释了失败的原因)。
- EINTR
- 系统调用被捕获的信号中断;请参阅 signal(7)。
- EISCONN
- 套接字已连接。
- ENETUNREACH
- 网络不可达。
- ENOTSOCK
- 文件描述符与套接字不相关。
- ETIMEDOUT
- 在尝试连接时超时。服务器可能太忙而无法接受新的连接。请注意,对于 IP 套接字,如果服务器启用了 syncookies,则超时时间可能很长。
符合
SVr4, 4.4BSD(connect() 函数首次出现在 4.2BSD 中),POSIX.1-2001。说明
POSIX.1-2001 不要求包含 <sys/types.h>,且在 Linux 上也不需要此头文件。然而,一些历史(BSD)实现需要此头文件,编写可移植应用程序时包含它是明智的。connect() 的第三个参数实际上是一个 int(这也是 4.x BSD 和 libc4 和 libc5 的情况)。一些 POSIX 混淆导致了当前的 socklen_t,glibc 也使用它。另请参阅 accept(2)。