目录
connect()函数用以在客户端使用,连接目标网络服务器。客户端在建立套接字之后,不需要进行地址绑定就可以直接连接服务器。连接服务器的函数为connect(),此函数连接指定参数的服务器,例如 IP 地址、端口等。
connect()函数介绍
connect()函数的原型如下
# include <sys/types.h >
# include <sys/socket.h >
int connect(int sockfd, struct sockaddr *, int addrlen);
其中的参数 sockfd 是建立套接字时返回的套接字文件描述符,它是由系统调用 socket 函数返回的。参数 serv_addr ,是一个指向数据结构 sockaddr 的指针,其中包括客户端需要连接的服务器的目的端口和 IP 地址,以及协议类型。参数 addrlen 表示第二个参数内容的大小,可以使用 sizeof(struct sockaddr) 而获得。
connect()函数的返回值在成功时为0,当发生错误的时候返回 -1,可以査看 errno 获得错误的原因。错误值及含义在下图中列出。
connect()函数的例子
下面是 connect()函数的使用实例代码,与服务器的代码类似,先建立一个套接字文件描述符,当成功建立描述后,将需要连接的服务器 IP 地址和端口填充到一个地址结构中,connect() 函数连接到地址结构所指定的服务器上。
# define DEST_IP "192.168.254.65" //服务器的 IP 地址
# define DEST_PORT 8888 //服务器端口
int main(int argc, char *argv[])
{
int ret = 0;
int sockfd; //sockfd 为连接的 socket
struct sockaddr_in serve; //服务器地址的信息
sockfd = socket(AE_INET, SOCK_STREAM, 0);
//检查是否正常初始化 socket
if(sockfd == -1)
{
perror (" socket ");
exit ( EXIT_FAILURE );
}
server.sin_family = AF_INET; //协议族为IPv4,主机字节序
server.sin_port = htons(DEST_PORT); //端口,短整型,网络字节序
server.sin_addr.s_addr = inet_addr(DEST_IP); //服务器的 IP 地址
bzero(server.sin_zero, sizeof(server.sin_zero));//保留字段置 O
//连接服务器
ret = connect(sockfd, (struct sockaddr)&server, sizeof(struct sockaddr));
if(ret == -1)
{
perror (" connect ");
}
//接收或者发送数据
//关闭
close ( sockfd );
}
连接成功后内核将sockfd 于连接两端的ip,port四元组绑定,后续发送和接收时只需要用sockfd 就能明确连接的两端。
应用层 connect() 函数和内核函数之间的关系
应用层 connect()函数和内核层的connect()函数关系如图所示
内核层的 connect()函数比较简单,主要进行不同的协议映射的时候要根据协议的类型进行选择,例如数据报和流式数据的 connect() 函数不同,流式的回调函数为inet_stream_connect(), 数据报的回调函数为inet_dgram_connect(), 所以TCP和UDP客户端调用connect() 的作用不同,tcp是连接执行三次握手,同时将连接成功的两端的ip,port与sockfd绑定;UDP客户端调用connnect()函数时,不会连接,只会将两端的ip,port与sockfd绑定,绑定了四元组的sockfd在本机唯一确定一条通信。