18.3.7 请求连接
当客户想要连接到服务器的时候,它会尝试在一个未命名套接字和服务器的监听套接字之间建立一个连接。它们用connect()系统调用来完成这一工作,它的一般形式是:
int connect(int socket, const struct sockaddr *address, size_t address_len);
参数socket指定的套接字将连接到参数address指定的服务器套接字上去,服务器套接字的长度由参数address_len指定。套接字必须是通过socket调用获得的一个有效的文件描述符。如果操作成功,函数返回0,否则返回–1。该函数产生的错误代码如表18.4所示。
表18.4 connect()系统调用返回的错误代码
代 码 |
说 明 |
EBADF |
文件描述符无效 |
EALREADY |
套接字上已经有了一个正在使用的连接 |
ETIMEDOUT |
连接超时 |
ECONNREFUSED |
连接请求被服务器拒绝 |
如果连接不能立刻建立起来,connect()会阻塞一段不确定的倒计时时间,这段倒计时时间结束后,这次连接就会失败。如果connect()调用是被一个信号中断的,而这个信号又得到了处理,connect还是会失败,但这次连接尝试是成功的,它会以异步方式继续尝试。
类似于accept()调用,connect()的阻塞特性可以用设置该文件描述符的O_NONBLOCK标志的办法来改变。在这种情况下,如果连接不能立刻建立起来,connect()会失败并把errno变量设置为EINPROGRESS,而连接将以异步方式继续尝试。
异步连接的处理是比较困难的,而我们可以在套接字文件描述符上用一个select()调用来表明该套接字已经处于写就绪状态。