CONNECT - Linux手册页
Linux程序员手册 第2部分
更新日期: 2020-04-11
名称
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_STREAM或SOCK_SEQPACKET,则此调用尝试建立与套接字的连接,该套接字绑定到由addr指定的地址。
某些协议套接字(例如UNIX域流套接字)可能仅成功一次connect()。
某些协议套接字(例如UNIX和Internet域中的数据报套接字)可能会多次使用connect()来更改其关联。
某些协议套接字(例如UNIX和Internet域中的TCP套接字以及数据报套接字)可以通过连接到sockaddr的sa_family成员设置为AF_UNSPEC的地址来解除关联。之后,套接字可以连接到另一个地址。 (从内核2.2开始在Linux上支持AF_UNSPEC。)
返回值
如果连接或绑定成功,则返回零。如果出错,则返回-1,并正确设置errno。
错误说明
以下仅是一般的套接字错误。可能还有其他特定于域的错误代码。
- EACCES
- 对于由路径名标识的UNIX域套接字:套接字文件上的写许可权被拒绝,或者路径前缀中的目录之一的搜索许可被拒绝。 (另请参见path_resolution(7)。)
- EACCES, EPERM
- 用户尝试连接到广播地址而未启用套接字广播标志,或者由于本地防火墙规则而导致连接请求失败。
- 如果SELinux策略拒绝了连接(例如,如果有一个策略说HTTP代理只能连接到与HTTP服务器关联的端口,并且该代理尝试连接到另一个端口),也可以返回EACCES。 dd
- EADDRINUSE
- 本地地址已被使用。
- EADDRNOTAVAIL
- (Internet域套接字)sockfd引用的套接字以前未绑定到地址,并且在尝试将其绑定到临时端口后,确定当前临时端口范围内的所有端口号都在使用中。请参阅ip(7)中对/ proc / sys / net / ipv4 / ip_local_port_range的讨论。
- EAFNOSUPPORT
- 传递的地址在其sa_family字段中没有正确的地址族。
- EAGAIN
- 对于非阻塞UNIX域套接字,该套接字是非阻塞的,并且连接无法立即完成。对于其他套接字系列,路由缓存中没有足够的条目。
- EALREADY
- 套接字未阻塞,并且以前的连接尝试尚未完成。
- EBADF
- sockfd不是有效的打开文件描述符。
- ECONNREFUSED
- 流套接字上的connect()发现没有人在监听远程地址。
- EFAULT
- 套接字结构地址在用户的地址空间之外。
- EINPROGRESS
- 套接字未阻塞,无法立即完成连接。 (UNIX域套接字因EAGAIN而失败。)可以通过选择要写入的套接字来选择select(2)或poll(2)以完成操作。在select(2)指示可写性之后,使用getsockopt(2)读取SOL_SOCKET级别的SO_ERROR选项,以确定connect()是成功完成(SO_ERROR为零)还是未成功完成(SO_ERROR是此处列出的常见错误代码之一),解释了失败的原因)。
- EINTR
- 系统调用被捕获的信号中断;参见signal(7)。
- EISCONN
- 套接字已连接。
- ENETUNREACH
- 网络不可达。
- ENOTSOCK
- 文件描述符sockfd不引用套接字。
- EPROTOTYPE
- 套接字类型不支持所请求的通信协议。例如,在尝试将UNIX域数据报套接字连接到流套接字时,可能会发生此错误。
- ETIMEDOUT
- 尝试连接时超时。服务器可能太忙而无法接受新连接。请注意,对于IP套接字,在服务器上启用syncookie时,超时可能会很长。
遵循规范
POSIX.1-2001,POSIX.1-2008,SVr4、4.4BSD,(connect()首次出现在4.2BSD中)。
备注
POSIX.1不需要包含,并且在Linux上不需要此头文件。但是,某些历史(BSD)实现需要此头文件,而可移植的应用程序最好将其包括在内。
有关socklen_t类型的背景,请参见accept(2)。
如果connect()失败,则将套接字的状态视为未指定。便携式应用程序应关闭插座并创建一个新插座以重新连接。
示例
getaddrinfo(3)中显示了connect()使用示例。
另外参见
accept(2),bind(2),getsockname(2),listen(2),socket(2),path_resolution(7),selinux(8)
出版信息
这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/。