TCP 网络编程API - connect()

目录

connect()函数介绍

connect()函数的例子

应用层 connect() 函数和内核函数之间的关系


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在本机唯一确定一条通信。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值