CONNECT - Linux手册页

时间:2019-08-20 17:58:37  来源:igfitidea点击:

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/