socket编程之connect()

news/2025/2/20 20:18:42/

5 connect()

connect() 系统调用将文件描述符 sockfd 引用的套接字连接到 addr 指定的地址。

2.1 包含头文件

#include <sys/types.h>        
#include <sys/socket.h>

2.2 函数主体

int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

参数解释:

  • int sockfd

​ socket()函数返回的未被使用的文件描述符

  • const struct sockaddr *addr

​ 该地址为所要连接的socket的地址,connect() 系统调用将文件描述符 sockfd 引用的套接字连接到 addr 指定的地址。

​ 如果套接字 sockfd 的类型为 SOCK_DGRAM,则 addr 是默认情况下数据报发送到的地址,也是接收数据报的唯一地址。如果套接字的类型为 SOCK_STREAM 或 SOCK_SEQPACKET,则此调用将尝试与绑定到 addr 指定的地址的套接字建立连接。通常,基于连接的协议套接字可能只成功连接()一次;无连接协议(例如UDP数据报)套接字可以多次使用 connect() 来更改其关联。

  • socklen_t addrlen

​ addrlen 参数指定 addr 的大小。

2.3 返回值

如果连接成功,则返回0;出错时,返回-1,错误类型如下:

错误类型解释
EACCES, EPERM用户尝试连接到广播地址,但未启用套接字广播标志,或者由于本地防火墙规则,连接请求失败。
EACCES(本地套接字)对套接字文件的写入权限被拒绝,或者对路径前缀中的某个目录的搜索权限被拒绝。
EADDRINUSE本地地址已在使用中。
EAFNOSUPPORT传递的地址其sa_family字段中不正确。
EAGAIN路由缓存中的条目不足。
EALREADY套接字为非阻塞套接字,且上一次尝试连接还未完成。
EBADFsockfd不是有效的文件描述符。
ECONNREFUSED流套接字上的 connect() 发现没有在监听的远程地址。
EFAULT套接字结构地址位于用户的地址空间之外。
EINTR本次系统调用被捕获的信号中断。
EISCONN套接字已连接。
ENETUNREACH网络无法访问。
EPROTOTYPE套接字类型不支持请求的通信协议。例如,尝试将 UNIX 域数据报套接字连接到流套接字时,可能会发生此错误。
ETIMEDOUT尝试连接时超时。 服务器可能太忙,无法接受新连接。 对于 IP 套接字,在服务器上启用 syncookie 时,超时可能很长。

2.4 小结

介绍完connect()函数之后,socket编程的五个基本函数便已经全部介绍完毕,基于这五个函数的两个或多个套接字便可以正常建立连接,进行读写操作,读写操作用到的函数将在后面的小节中继续总结更新。此处,先对服务端和客户端建立连接的过程进行总结。

我们创建的socket的数据结构如下图,每个进程都会维护一个这样的文件描述符表。

在这里插入图片描述

服务端与客户端建立连接的流程如下:

  • 服务端:socket()—bind()—listen()—accept()(阻塞…)
  • 客户端:socket()—connect()(阻塞…)

在客户端调用connect()尝试连接服务端时,双方三次握手建立连接的流程如下:

在这里插入图片描述

对上图进一步补充说明:

  • 客户端调用connect()时,双方开始三次握手建立连接,建立连接流程如下:

    • 客户端调用connect()后阻塞,向服务端发送SYN J包,此时客户端进入SYN_SENT状态,等待服务端发送ACK+SYN
    • 服务端收到SYN报文后,进入SYN_RCVD状态,发送ACK J+1,SYN K给客户端,发送成功后进入ESTABLISTED状态。
    • 客户端收到ACK+SYN后,connect()返回,进入ESTABLISTED状态,向服务端发送ACK K+1。
    • 服务端收到ACK包后,accept()函数返回,返回值为监听socket维护的第一个队列中的第一个socket。
  • 监听套接字会维护两个连接队列,第一个为进入ESTABLISTED状态的套接字队列,第二个为ESTABLISTED状态之前的套接字队列。可以通过“netstat -an”命令查看主机目前所维护的来连接。

在这里插入图片描述

  • 服务端和客户端socket初始化步骤为何有区别:

    • 服务端,顾名思义用来提供服务,不同的端口提供不同的服务,因此需要绑定唯一的端口来表明该服务的地址,这样客户端才可以找到该服务的位置。
    • 客户端,建立连接也需要一个端口,但是并不需要固定一个端口,因此默认有系统随机分配。同时面向连接的TCP数据报中会包含主机与目的主机的IP和端口,因此,不需要再应用层使用bind()进行绑定。

函数的简单实战可以通过这个项目:代码传送门


http://www.ppmy.cn/news/269483.html

相关文章

基于Java+SpringBoot制作一个论坛小程序

制作一个论坛互动平台,让兴趣志同道合者用户聚集在这里交流话题、展示自我、结交朋友。 一、小程序1.1 项目创建1.2 首页1.3 论坛板块页1.4 个人中心页1.5 帖子详情页二、API2.1 SpringBoot框架搭建

周杰伦要出新专辑了?上 Instagram 看看

最近周杰伦Instagram发布动态又上了微博热搜&#xff1a;如果我说六七月发新专辑&#xff0c;你们是不是又不信了&#xff1f;如何能看周董的ins呢&#xff0c;这里分享2个app。 第一个insplus https://insplusapp.com&#xff0c;有安卓和iOS版本。在发现里就可以看到周杰伦&a…

彩虹歌词-周杰伦

一、歌曲目录 图片来源于&#xff1a;图片来源超链接 二、歌词目录 [歌曲名称:彩虹] [歌曲原唱:周杰伦] [所属专辑:我很忙] [00:14.11]哪里有彩虹告诉我 [00:19.98]能不能把我的愿望还给我 [00:26.56]为什么天这么安静 [00:32.70]所有云都跑到我这里 [00:38.79] [00:39.11] […

分析了波周杰伦,还做了数据可视化!

本案例中的歌词数据来自中文歌词数据库。 前排提示&#xff1a;文末送可视化好书~ 这个数据库提供了华语歌手的歌曲及歌词信息&#xff0c;数据以 JSON 格式存储。 为了尽量完整地呈现从原始数据到可视化的过程&#xff0c;接下来我们会先简单讲解数据的预处理过程&#xff0c;…

再遇周杰伦隐私协议

本隐私信息保护政策版本&#xff1a;2021 V1 一、重要提示 请您&#xff08;以下亦称“用户”&#xff09;在使用本平台App时仔细阅读本协议之全部条款&#xff0c;并确认您已完全理解本协议之规定&#xff0c;尤其是涉及您的重大权益及义务的加粗或划线条款。如您对协议有任…

上 Instagram 看看周杰伦又更新了什么动态

苏生不惑第233 篇原创文章&#xff0c;将本公众号设为星标&#xff0c;第一时间看最新文章。 为什么突然写Instagram呢&#xff0c;前几天周杰伦的一条ins&#xff1a;哥刮胡子了请问大家满意吗 上了微博热搜&#xff0c;有了刘德华开抖音了&#xff0c;一键下载华仔所有无水印…

周杰伦《青花瓷》歌词欣赏-----方文山作词,周杰伦谱曲

我一向不是一个非常崇拜某个人的音乐的人&#xff0c;只是有喜欢的歌就可以&#xff0c;不会盲目的崇拜某个人&#xff0c;只是喜欢某一首歌&#xff0c;当然还会看一下是谁的词和曲&#xff01;周杰伦大部分的词都是方文山写的&#xff0c;而这首新歌《 青花瓷 》显的如此优美…