Skip to content

connect

果冻虾仁 edited this page Jan 28, 2015 · 12 revisions

客户端函数。属于进程到内核的传递套接字地址结构的函数。 ##函数原型

#include <sys/types.h>  /* POSIX.1-2001以及Linux都不需要包含此头文件 */
#include <sys/socket.h>

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

##参数

  • sockfd必须是套接字描述符
  • addr是要连接的远程套接字的地址,依据通信域的不同而不同(使用的时候需要进行类型转换):
通信域 addr
AF_UNIX sockaddr_un
AF_INET sockaddr_in
AF_INET6 sockaddr_in6
  • addrlen为套接字地址结构的长度,属于值参数。POSIX建议socklen_t定义为uint32_t。

##返回值 成功返回0,失败返回-1,并设置errno。可能的错误条件有:

errno 描述
EBADD 参数socket不是合法的套接字描数字
EALREADY 已经有一悬挂的连接正在被处理
ETIMEDOUT 建立连接的时间限已过而未能建立连接
ECONNREFUSED 服务端拒绝此连接
EINTR 建立连接的企图被捕获的信号所中断

  正常情况下,当连接不能立即建立时,connect()等待知道服务程序回答了连接请求,或等待时间超过了某个时间限制之后才返回。 如果是超时返回,connect()将失败并且流产(abort)连接请求。如果connert()在阻塞期间由于收到信号而被中断,它将失败并置errnoEINTER,但是连接请求不会流产,而是异步地被建立。
  可以对套接字socket设置非阻塞方式,从而使connect()不等待回答就直接返回。对套接字设置非阻塞方式的方法同文件描述字一样使用fcntl()。
  如果对套接字socket设置了非阻塞标志O_NONBLOCK,当连接不能立即建立时,connect()将失败并置errno为EINPROGRESS,但是连接请求不会被流产而是被异步地建立。在连接建立之前,后继对同一套接字调用connect()将导致EALREADY而失败。
  对于异步建立的连接,可用select()和poll()来指出套接字就绪。
  客户进程调用connect()之前不必调用bind()
,内核在必要时会为该套接字选择适当的地址。

引用自《Unix/Linux程序设计教程》(赵克佳、沈志宇编)P380

Linux环境编程API

C语言API包含部分标准C的API、POSIX标准的系统编程API(一些Linux独有的系统API会单独注明)。

头文件源码

大部分头文件源码在/usr/include目录下。

安装man手册

因为涉及到大量的POSIX编程。所以最好下载POSIX函数的man手册。

Ubuntu

apt-get install manpages-posix        
apt-get install manpages-posix-dev

默认安装了manpages-dev,所以不装POSIX的man手册是可以查看绝大部分API的。
但是不装的话,有些API是不能看到的,比如posix_spawn函数。

CentOS

yum install man-pages.noarch

关于目录

左侧的目录并非以函数为索引依据,主要是以系统的man手册页面为索引依据。
比如exec里面包含6个函数、pipe里面包含pipe()和pipe2()两个函数,但是它们都是属于一个man页面中。

Clone this wiki locally