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);

描述

connect() 系统调用将由文件描述符 sockfd 引用的套接字连接到由 addr 指定的地址。addrlen 参数指定 addr 的大小。addr 中地址的格式由套接字 sockfd 的地址空间决定;有关详细信息,请参阅 socket(2)

如果套接字 sockfd 的类型为 SOCK_DGRAM,则 addr 是默认发送数据报的目的地址,也是接收数据报的唯一地址。如果套接字类型为 SOCK_STREAMSOCK_SEQPACKET,则此调用尝试连接到绑定到 addr 指定地址的套接字。

通常,基于连接的协议套接字可能只成功 connect() 一次;无连接协议套接字可以使用 connect() 多次来更改其关联。无连接套接字可以通过连接到 sockaddrsa_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)

示例

connect() 的一个用例示例在 getaddrinfo(3) 中所示。

参见

accept(2), bind(2), getsockname(2), listen(2), socket(2), path_resolution(7)

引用自

accept4(2), acpi_listen(8), acpid(8), ddp(7), ei_connect(3), erl_connect(3), explain(1), explain(3), explain_connect(3), explain_connect_or_die(3), gen_sctp(3), getpeereid(3), getpeername(2), ldap.conf(5), ldap_set_option(3), lwres_getaddrinfo(3), netlink(7), packet(7), pmsocks(1), pth(3), rds(7), recv(2), rpc_clnt_create(3), rtime(3), sctp(7), select_tut(2), shutdown(2), slapd-ldap(5), slapd-meta(5), socket(7), socketcall(2), ssh-ldap.conf(5), sssd-ldap(5), strobe(1), tcp(7), telnet(1), traceroute(8), udp(7), unix(7), write(2), xdm(1)