socket-connect

来源:互联网 发布:大风歌 知乎 编辑:程序博客网 时间:2024/05/16 04:57

摘要:网络编程socketapi存在一批核心接口,而这一批核心接口就是几个看似简单的函数,尽管实际上这些函数没有一个是简单。connect函数就是这些核心接口的一个函数,它完成主动连接的过程。

connect函数的功能是完成一个有连接协议的连接过程,对于TCP来说就是那个三路握手过程,它的函数原型:

#include int connect(int sockfd, const struct sockaddr* server_addr,socklen_t addrlen) 返回:0──成功, -1──失败。

 

为了理解connect函数,我们需要对connect函数的功能进行介绍。connect函数的功能可以用一句话来概括,就是完成面向连接的协议的连接过程,它是主要连接的。面向连接的协议,在建立连接的时候总会有一方先发送数据,那么谁调用了connect谁就是先发送数据的一方。如此理解connect三个参数是容易了,我必需指定数据发送的地址,同时也必需指定数据从哪里发送,这正好是connect的前两个参数,而第三个参数是为第二个参数服务的。

参数sockfd
指定数据发送的套接字,解决从哪里发送的问题。内核需要维护大量IO通道,所以用户必需通过这个参数告诉内核从哪个IO通道,此处就是从哪个socket接口中发送数据。sockfd是先前socket返回的值。
参数server_addr
指定数据发送的目的地,也就是服务器端的地址。这里服务器是针对connect说的,因为connect是主动连接的一方调用的,所以相应的要存在一个被连接的一方,被动连接的一方需要调用listen以接受connect的连接请求,如此被动连接的一方就是服务器了。
参数addrlen
指定server_addr结构体的长度。我们知道系统中存在大量的地址结构,但socket接口只是通过一个统一的结构来指定参数类型,所以需要指定一个长度,以使内核在进行参数复制的时候有个有个界限。

 

与所有的socket网络接口一样,connect总会在某个时候可能失败,此时它会返回-1,相应的errno会被设置,用户可能通过这个值确定是哪个错误。常见的错误有对方主机不可达或者超时错误,也可以是对方主机没有相应的进程在对应端口等待。


 

 在C/S模式中,有时候我们需要连接服务器去下载一些更新,所以在客户端启动时,客户端自动连接服务器下载更新,如果客户端与服务器之间网络连接不通,则客户端不用一直等待连接,而是在一定时间内(可以设为若干秒)自动判定网络连接出错,从而不再请求更新~~


  socket函数生成socket结构体时,默认生成的socket是阻塞的~如果我们使用connect去连接服务器,而这时网络出现故障,则connect默认等候很长一段时间然后返回错误~


  我们可以设置socket为非阻塞模式,可以设定一定的等候时间,如果在设定的等候时间内connect失败,则我们判定网络出现故障~~



Socket中InputStream的read()当管道无数据时便等待数据的填充,但OutputStream可以继续写入数据.read()阻塞后,继续想服务器提交数据,read()方法便会读出服务器的响应数据来. 
原创粉丝点击