美文网首页
linux手册翻译——connect(2)

linux手册翻译——connect(2)

作者: 蟹蟹宁 | 来源:发表于2021-07-03 09:34 被阅读0次

    \color{#A00000}{NAME}
    connect - initiate a connection on a socket

    \color{#A00000}{SYNOPSIS}

    #include <sys/socket.h>
    int connect(int sockfd, const struct sockaddr *addr,
                       socklen_t addrlen);
    

    \color{#A00000}{DESCRIPTION}
    connect() 系统调用将文件描述符 sockfd 引用的套接字连接addr 指定的地址。 addrlen 参数指定 addr 的大小。 addr中地址的格式由 sockfd 在创建时指定的域(或者说协议族); 更多详细信息,可以看linux手册翻译——socket(7)中关于地址结构的描述。

    如果套接字 sockfd 是 SOCK_DGRAM 类型,那么 addr 将是发送数据报时的默认地址,也是接收数据报时的唯一可接收地址。如果套接字是 SOCK_STREAM 或 SOCK_SEQPACKET 类型,则此调用尝试与绑定到 addr 指定的地址的套接字建立连接。

    某些协议套接字(例如 UNIX 域流套接字)可能只需要成功 connect() 一次。

    某些协议套接字(例如,UNIX 和 Internet 域中的数据报套接字)可能会多次使用 connect() 来更改它们的关联。

    一些协议套接字(例如,TCP套接字以及UNIX和Internet域中的数据报套接字),可以通过连接到sockaddr.sa_family为AF_UNSPEC的addr来解除关联,之后就可以重新连接到其他的地址。(AF_UNSPEC从内核2.2开始在Linux上得到支持。)

    \color{#A00000}{RETURN VALUE}
    如果连接或绑定成功,则返回零。 出错时,返回 -1,并设置 errno 以指示错误。

    \color{#A00000}{ERRORS}
    以下仅为一般套接字错误。 可能还有其他特定于域的错误代码。

    • EACCES
      对于由路径名标识的 UNIX 域套接字:套接字文件的写入权限被拒绝,或者路径前缀中的目录之一的搜索权限被拒绝。 (另见 path_resolution(7)。)

    • EACCES, EPERM
      用户在未启用套接字广播标志的情况下尝试连接到广播地址,或者由于本地防火墙规则导致连接请求失败。
      如果 SELinux 策略拒绝连接(例如,如果有策略规定 HTTP 代理只能连接到与 HTTP 服务器关联的端口,而代理尝试连接到不同的端口),也可以返回 EACCES。

    • EADDRINUSE
      本地地址已被使用。

    • EADDRNOTAVAIL
      (Internet 域套接字) sockfd 引用的套接字此前未绑定到地址,并且在尝试将其绑定到临时端口时,确定临时端口范围内的所有端口号当前都在使用中。 请参阅 ip(7) 中对 /proc/sys/net/ipv4/ip_local_port_range 的讨论。

    • EAFNOSUPPORT
      addr的地址族不合法。

    • EAGAIN
      对于非阻塞 UNIX 域套接字,套接字是非阻塞的,并且不能立即完成连接。 对于其他套接字系列,路由缓存中的条目不足。

    • EALREADY
      套接字是非阻塞的,之前的连接尝试尚未完成。

    • EBADF
      sockfd is not a valid open file descriptor.

    • ECONNREFUSED
      A connect() on a stream socket found no one listening on the remote address.

    • EFAULT
      套接字结构地址在用户地址空间之外。

    • EINPROGRESS
      The socket is nonblocking and the connection cannot be completed immediately. (UNIX domain sockets failed with EAGAIN instead.) It is possible to select(2) or poll(2) for completion by selecting the socket for writing. After select(2) indicates writability, use getsockopt(2) to read the SO_ERROR option at level SOL_SOCKET to determine whether connect() completed successfully (SO_ERROR is zero) or unsuccessfully (SO_ERROR is one of the usual error codes listed here, explaining the reason for the failure).

    • EINTR
      系统调用被捕获的信号中断; 见信号(7)。

    • EISCONN
      The socket is already connected.

    • ENETUNREACH
      Network is unreachable.

    • ENOTSOCK
      The file descriptor sockfd does not refer to a socket.

    • EPROTOTYPE
      套接字类型不支持请求的通信协议。 例如,在尝试将 UNIX 域数据报套接字连接到流套接字时可能会发生此错误。

    • ETIMEDOUT
      尝试连接时超时。 服务器可能太忙而无法接受新连接。 请注意,对于 IP 套接字,当在服务器上启用 syncookies 时,超时可能会很长。

    \color{#A00000}{CONFORMING TO}
    POSIX.1-2001, POSIX.1-2008, SVr4, 4.4BSD, (connect() first appeared in 4.2BSD).

    \color{#A00000}{NOTES}
    有关 socklen_t 类型的背景信息,请参阅 accept(2)
    如果 connect() 失败,则将套接字的状态视为未指定。 可移植应用程序应关闭套接字并创建一个新套接字以重新连接。

    \color{#A00000}{EXAMPLES}
    getaddrinfo(3) 中显示了使用 connect() 的示例。

    相关文章

      网友评论

          本文标题:linux手册翻译——connect(2)

          本文链接:https://www.haomeiwen.com/subject/odleultx.html