深入探究connect函数

来源:互联网 发布:死亡之屋4软件下载 编辑:程序博客网 时间:2024/06/05 20:21

网络编程socket api存在一批核心接口,connect函数就是这些核心接口的一个函数,它完成主动连接的过程。

connect函数的功能可以用一句话来概括,就是完成面向连接的协议的连接过程,它是主要连接的。

函数参数:

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

参数含义

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

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

    返回值:没有错误发生,返回0;否则返回SOCKET_ERROR。
    connect函数可用于面向连接套接字,也可用于无连接套接字。
    无连接套接字:对于无连接的套接字(SOCK_DGRAM)
    该套接字与目标地址之间建立默认的对应关系,网络数据交互发生。可以直接使用 send,而不是用sendto来向该地址发送数据;内核会丢弃所有发送给该套接字的源地址不是connect 地址的报文。再次调用connect函数:此时name和namelen两个参数均为空指针,就会将该套接字恢复为未连接状态,再调用send函数,系统会提示WSAENOTCONN错误码。