-
Notifications
You must be signed in to change notification settings - Fork 53
connect
客户端函数。属于进程到内核的传递套接字地址结构的函数。 ##函数原型
#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()在阻塞期间由于收到信号而被中断,它将失败并置errno为EINTER,但是连接请求不会流产,而是异步地被建立。
可以对套接字socket设置非阻塞方式,从而使connect()不等待回答就直接返回。对套接字设置非阻塞方式的方法同文件描述字一样使用fcntl()。
如果对套接字socket设置了非阻塞标志O_NONBLOCK,当连接不能立即建立时,connect()将失败并置errno为EINPROGRESS,但是连接请求不会被流产而是被异步地建立。在连接建立之前,后继对同一套接字调用connect()将导致EALREADY而失败。
对于异步建立的连接,可用select()和poll()来指出套接字就绪。
客户进程调用connect()之前不必调用bind(),内核在必要时会为该套接字选择适当的地址。引用自《Unix/Linux程序设计教程》(赵克佳、沈志宇编)P380
Talk is cheap, show me the code!
C语言API包含部分
标准C的API、POSIX标准的系统编程API(一些Linux独有的系统API会单独注明)。
大部分头文件源码在/usr/include
目录下。
因为涉及到大量的POSIX编程。所以最好下载POSIX函数的man手册。
apt-get install manpages-posix
apt-get install manpages-posix-dev
默认安装了manpages-dev
,所以不装POSIX的man手册是可以查看绝大部分API的。
但是不装的话,有些API是不能看到的,比如posix_spawn
函数。
yum install man-pages.noarch
关于目录
左侧的目录并非以函数为索引依据,主要是以系统的man手册页面为索引依据。
比如exec里面包含6个函数、pipe里面包含pipe()和pipe2()两个函数,但是它们都是属于一个man页面中。