connect() - Unix,Linux 系统调用
Tutorials Point


  Unix 初学者指南
  Unix Shell 编程
  高级 Unix
  Unix 有用参考
  Unix 有用资源
  精选阅读

版权所有 © 2014 tutorialspoint



  首页     参考     讨论区     关于 TP  

connect() - Unix,Linux 系统调用


previous next AddThis Social Bookmark Button

广告

名称

connect - 在套接字上启动连接

概要

#include <sys/types.h> 
#include <sys/socket.h> 

int connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen);

描述

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

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

通常,基于连接的协议套接字可能只能成功调用 connect() 一次;无连接协议套接字可以使用 connect() 多次来更改其关联。无连接套接字可以通过将 sockaddrsa_family 成员设置为 AF_UNSPEC 来连接到一个地址来解散关联。

返回值

如果连接或绑定成功,则返回零。如果出错,则返回 -1,并且 errno 被相应地设置。

错误

以下仅是一般的套接字错误。可能还有其他特定于域的错误代码。

错误代码描述
EACCES 对于由路径名标识的 Unix 域套接字:对套接字文件写入权限被拒绝,或者对路径前缀中的一个目录搜索权限被拒绝。(另请参见 path_resolution(2)。)
EACCES, EPERM 用户尝试连接到广播地址,但未启用套接字广播标志,或者由于本地防火墙规则导致连接请求失败。
EADDRINUSE 本地地址已经在使用中。
EAFNOSUPPORT 传递的地址在其 sa_family 字段中没有正确的地址族。
EADDRNOTAVAIL 请求不存在的接口或请求的地址不是本地的。
EALREADY 套接字是非阻塞的,并且之前的连接尝试尚未完成。
EBADF 文件描述符不是描述符表中的有效索引。
ECONNREFUSED 远程地址上没有人监听。
EFAULT 套接字结构地址位于用户地址空间之外。
EINPROGRESS 套接字是非阻塞的,并且连接无法立即完成。可以通过选择用于写入的套接字来选择(2)或轮询(2)以完成。在select(2)指示可写性后,使用getsockopt(2)读取级别SOL_SOCKETSO_ERROR选项以确定connect()是否成功完成(SO_ERROR为零)或不成功(SO_ERROR是此处列出的常用错误代码之一,解释了失败的原因)。
EINTR 系统调用被捕获的信号中断。
EISCONN 套接字已连接。
ENETUNREACH 网络不可达。
ENOTSOCK 文件描述符未与套接字关联。
ETIMEDOUT 尝试连接时超时。服务器可能太忙而无法接受新的连接。请注意,对于 IP 套接字,当在服务器上启用 syncookies 时,超时可能会非常长。

符合标准

SVr4, 4.4BSD(connect() 函数首次出现在 4.2BSD 中)。

注意

connect() 的第三个参数实际上是一个 int(这就是 4.x BSD 和 libc4 和 libc5 所具有的)。一些 POSIX 混淆导致了现在的 socklen_t,glibc 也使用它。另请参见 accept(2)。

缺陷

使用带有 AF_UNSPEC 地址的 connect() 调用断开套接字连接尚未实现。

参见



previous next Printer Friendly

广告


  

广告



广告