套接字编程之接口

news2024/11/24 3:19:51

套接字编程之接口

    • 学习套接字之前你需要知道的
    • 套接字编程
      • 套接字
      • TCP协议和UDP协议区别
    • UDP协议的编写
      • UDP通信两端流程
    • 具体操作接口介绍
      • 创建套接字
      • 为套接字绑定地址信息
      • 发送数据
      • 接收数据
      • 关闭套接字
      • 字节序相关接口

在这里插入图片描述

📌————本章重点————📌
🔗了解套接字的概念;
🔗了解TCP协议和UDP协议区别;
🔗了解UDP协议的编写;
🔗学习具体相关套接字接口;
✨————————————✨

学习套接字之前你需要知道的

 套接字编程,通俗的来说:主要讲解的是如何编写一个网络通信程序

1.网络通信的数据汇总都会包含一个完整的为五元组(sip[源端ip地址]、sport[源端端口]、dip[目的端IP地址]dport、protocol[协议]);五元组完成的描述了数据从哪里来到哪里去,用的是什么数据格式。
2.网络通信,通常讨论的是俩个主机之间的通信:客户端&服务端
 客户端网络通信程序:通常指的是用户使用的一端
 服务端网络通信程序:通常指的是网络编写服务端程序的工作
3.同时我们需要了解:客户端永远都是首先发起服务请求的一端,因为服务器是不知道客户端的地址的,现在用的是动态地址分配,每次上网地址可能发生改变,开发客户端程序都写入了服务端的地址和端口,因此客户端是知道服务端的地址,还有一种原因,只有客户发送了请求,服务端才能提供对应的服务。

套接字编程

套接字

 套接字:socket(插座、接口)的翻译,通常表示的是系统提供给程序员实现网络通信的一套接口,为啥封装这些接口呢?因为我们知道,网络通信中有很多的协议, 所以在这套接口中就提供了足够充足的选择。我们通常使用的主要是两个协议的通信程序编写:传输层的TCP和UDP协议

TCP协议和UDP协议区别

TCP协议UDP协议
传输控制协议用户数据报协议
提供的是一套面向链接,可靠,基于字节流的数据传输提供的是无连接,不可靠,基于数据包的数据传输
面向链接:通信前先要确定双方是否在线(像打电话)无连接:不需要建立链接,只需要知道对方地址,就可以直接发送数据(像发短信)
可靠传输:通过大量的一些控制机制,保证数据能够安全(有序且完整,一致)到达对端不可靠:只要数据发送出去就行,不管是否可以到达对端
字节流:没有传输大小限制,传输比较灵活的一种传输方式(像水流,可以一点一点取,没有具体要求)数据报:有最大大小限制,且传输交付有大小限制的一种传输方式(像冰块,每一次要取一块,不能一点一点的取)
适用于安全要求大于实时传输的要求的场景,比如文件传输因为没有大量的控制机制,因此传输速度快,所以适用于实时性要求大于安全性要求的场景,比如视频的传输

UDP协议的编写

UDP通信两端流程

服务端:

  1. 创建套接字–建立当前进程与网卡之间的关联,在内核中,创建了一个socket结构体
  2. 为套接字绑定地址信息,给创建的socket结构体,内部描述源端IP地址和端口
    (1) 告诉系统收到的数据中凡是地址和端口是我绑定就交给我处理
    (2)发送数据的时候,源端地址就是绑定的地址信息绑定的地址,必须是当前设备所拥有的地址
  3. 接收数据:从内核的socket结构体接收缓冲区中取出数据
  4. 发送数据:将数据放到内核socket结构体的发送缓冲区中,什么时候实际发送出去,由系统决定
  5. 不通信了,就关闭套接字,释放资源

客户端:

  1. 创建套接字
  2. 为套接字绑定地址信息(不推荐)
    一个端口只能被一个网络进程占用。因此一旦客户端程序中绑定的固定的地址这个客户端就只能运行一个了,并且还有端口
    冲突的风险。
  3. 发送数据
    如果绑定了地址信息,则源端地址就是绑定的,如果没有绑定地址信息,则系统会选择一个合适的地址和端口进行自动绑定。
  4. 接收数据
    不需要考虑,只需要从接收缓冲区取出数据即可
  5. 不通信了则关闭套接字释放资源。
    在这里插入图片描述

具体操作接口介绍

创建套接字

	#include<sys/types.h>
	#incldue<sys/socket.h>
	int socket(int domain, int type, int protocol);
	
  1. domain:地址域类型(具体用的是哪种方式,不同的方式有不同的地址结构:ipv4,ipv6,域间通信)
    重点记住AF_INET,比较常用
    在这里插入图片描述

  2. type:套接字类型
    注意:两种套接字不能混用,你创建的是哪种协议就要用哪个参数:

  3. protocol:协议类型
    注意:默认使用0,则表示使用套接字类型对应的默认协议,注意记住以下俩种:
    (1)IPPROTO_TCP: 值是6
    (2)IPPROTO_UDP:值是17
    在这里插入图片描述

  4. 成功返回一个套接字描述符,失败返回:-1;

为套接字绑定地址信息

	int bind(int socket, const struct sockaddr *address,socklen_t address_len);
1.sockfd:返回套接字的描述符
2.addr:要绑定的地址信息(不同地址域类型有不同的地址结构,故需要一个通用的地址结构)

通用地址结构:
 socket API是一层抽象的网络编程接口,适用于各种底层网络协议,如IPv4、IPv6,以及后面要讲的UNIX Domain Socket. 然而, 各种网络协议的地址格式并不相同.
在这里插入图片描述
注意:
 1.IPv4和IPv6的地址格式定义在netinet/in.h中,IPv4地址用sockaddr_in结构体表示,包括16位地址类型, 16位端口号和32位IP地址
 2.IPv4、IPv6地址类型分别定义为常数AF_INET、AF_INET6. 这样,只要取得某种sockaddr结构体的首地址,不需要知道具体是哪种类型的sockaddr结构体,就可以根据地址类型字段确定结构体中的内容.
 3.socket API可以都用struct sockaddr *类型表示, 在使用的时候需要强制转化成sockaddr_in; 这样的好处是程序的通用性, 可以接收IPv4, IPv6, 以及UNIX Domain Socket各种类型的sockaddr结构体指针做为参数;
sockaddr 结构
在这里插入图片描述
sockaddr_in 结构
在这里插入图片描述
在这里插入图片描述

 虽然socket api的接口是sockaddr, 但是我们真正在基于IPv4编程时, 使用的数据结构是sockaddr_in; 这个结构里主要有三部分信息: 地址类型, 端口号, IP地址.
in_addr结构
在这里插入图片描述
in_addr用来表示一个IPv4的IP地址. 其实就是一个32位的整数

typedef uint32_t in_addr_t
in_addr_t inet_addr(cosnst char*ip); 

 功能:将点分十进制字符串ip地址转化为网络字节序的整数ip地址 ,如:将192.168.2.2->0x0202a8c0

const char *inet_ ntoa(struct in_ addr addr);
功能:将网络字节序整数P地址, 转换为一个点分 十进制字符串地址
struct in_ addr{
	in_ addr_ ts _addr;
}

在这里插入图片描述

发送数据

	ssize_ t sendto(int sockfd, void *buf, size_ _t dlen, int flag, struct sockaddr *peer,socklen_ t alen);

解释:

1.sockfd: socket返回的套接字描述符
2.buf:要发送的数据空间起始地址
3.dlen:要发送的数据长度,从buf地址开始, 发送dlen长度的数据
4.peer设置的是谁的地址,数据就发给谁,peer:对端地址信息,描述了数据要发送给谁
5.flag:默认0- 阻塞发送(发送缓冲区数据满了就等着)
6.alen:对端地址信息长度
7.**返回值:**成功返回实际发送数据字节长度;失败返回-1

接收数据

4.接收数据

	ssize_ .t recvfrom(int sockfd, void *buf, size. t dlen, int flag, struct sockaddr *peer, socklen _t *alel

解释:

1.sockfd:套接字描述符
2.buf:空间起始地址,接收到的数据就被放入到buf空间中
3.peer用于获取地址信息,peer中存的是谁,数据就是谁发送给我的,peer这个参数是在recvfrom函数中设置的,我们不用设置。peer:接收数据的同时,得直到数据是谁发的,因此这里的peer是个输出参数,用于返回对端地址信息
4.dlen:想要接收的数据长度
5.flag:默认0-阻塞接收(socket接收缓冲区中没有数据就阻塞,直到有数据)
6.alen:地址信息长度,也是一个输入输出参数,表示想要接收的地址信息长度,以及实际得到的地址信息长度
7.返回值:成功返回实际接收到的数据长度;失败返回-1

*注意:凡是涉及到获取地址信息的操作,地址信息都是socklen _t 类型的

关闭套接字

	int close(int fd)

字节序相关接口

字节序相关接口:

主机字节序到网络字节序的转换: uint32_ t htonl(uint32 _ t val); uint16 t htons(uint16_ t val);
网络字节序到主机字节序的转换: uint32_ t ntoh(uint32 _ t val); uint16 _ t ntohs(uint16_ t val);

注意:
 这几个接口中已经进行了主机字节序的判断,因此不需要担心自己的主机字节序,32位数据转换接口,与16转换接口,不能混用
混用出错例子:
在这里插入图片描述

具体代码实现请看下一篇:套接字编程之简单实现

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/158214.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Ansible】ansible 变量

ansible 变量 文章目录ansible 变量一、Ansible 变量介绍二、变量命名规则三、变量类型1.全局变量2.剧本变量3.资产变量4.Facts 变量5.注册变量6.变量优先级一、Ansible 变量介绍 在 PlayBook 一节中&#xff0c;将 PlayBook 类比成了 linux 中的shell。那么它作为一门 ansibl…

搜索引擎收录查询,是什么影响了网站被搜索引擎收录

搜索引擎收录是指程序通过辨别把网站内容进行收录&#xff0c;同时会对这些内容进行价值以及其他方面的辨别。 我们想要知道网站有没有被搜索引擎收录&#xff0c;可以借助iis7seo批量查来查询网站有没有被搜索引擎收录。打开iis7seo批量查&#xff0c;添加需要查询的网站网址&…

计算结构体,位段,联合体(共用体)的大小

目录 一、计算结构体的大小 1.1 结构体的计算并不是简单的类型加运算 1.2 内存对齐 1.2.1 内存对齐规则 1.2.2 图解内存对齐 二、计算位段的大小 2.1位段是什么 2.2 位段的内存分配 三、计算联合体的大小 3.1 什么是联合体 3.2 联合体的内存分配 END. 一、计算结构…

Consensus Algorithm -- Raft

The Raft Consensus Algorithm Go 实现&#xff1a;etcd/raft、dragonboat Rust 实现&#xff1a;TiKV C 实现 &#xff1a;nebula-graph-storage、 RethinkDB、logcabin 拜占庭将军问题 拜占庭将军问题&#xff08;Byzantine failures&#xff09;&#xff0c;是由莱斯利兰…

绝绝子!这些技巧真方便

技巧一&#xff1a;快速切换窗口 如果你还在使用桌面底部“任务栏”切换软件窗口&#xff0c;不妨试试这个“快速切换窗口”快捷键&#xff0c;仅需按住【Alt】键不放&#xff0c;并连续点按【tab】键即可实现窗口的快速切换&#xff0c;果真只有亲自上手体验才知道有多香&…

NLP中的对话机器人——问答机器人的应用场景

引言 本文是七月在线《NLP中的对话机器人》的视频笔记&#xff0c;主要介绍FAQ问答型聊天机器人的实现。 讲得还不错&#xff0c;关键是只要1分钱 FAQ问答机器人 FAQ就是一些常见问题与回答&#xff0c;比如https://letsencrypt.org/docs/faq/。 但是我们要做的不是一问一答…

原生RedHat OpenStack搭建

文章目录OpenStack的搭建方式实验软件及镜像实验环境配置NTP节点初始化配置配置本地yum仓库上传镜像文件至NTP节点搭建基于http的网络yum源搭建NTP服务配置Controller控制节点和Compute计算节点初始化配置安装RedHat OpenStack安装部署OpenStack配置OVS桥接OpenStack的搭建方式…

大赛启幕:2023数字中国创新大赛启动发布会在福州召开

2023年1月10日&#xff0c;由数字中国建设峰会组委会主办&#xff0c;福建省数字办、福建省工信厅、福建省通信管理局、福州市政府、泉州市政府、三明市政府、龙岩市政府等共同承办的2023数字中国创新大赛在福建省福州市盛大启幕。 十二届全国政协副主席王钦敏发来书面致辞。中…

Windows 10随机性死机怎么办?

在诸多的电脑问题中&#xff0c;死机算是格外恼人。尤其是当你正在编辑文档&#xff0c;正在做图&#xff0c;正在玩游戏&#xff0c;电脑突然死机&#xff0c;万一再加上没保存…… 如果你在使用Win10系统的过程中遇到随机性死机的问题&#xff0c;赶紧看看这篇文章。 小编整…

LeetCode 113. 路径总和 II

&#x1f308;&#x1f308;&#x1f604;&#x1f604; 欢迎来到茶色岛独家岛屿&#xff0c;本期将为大家揭晓LeetCode 113. 路径总和 II&#xff0c;做好准备了么&#xff0c;那么开始吧。 &#x1f332;&#x1f332;&#x1f434;&#x1f434; 一、题目名称 LeetCode …

简单通讯录的实现

这次我们来实现一个简单的通讯录 目录 1.基本框架及的实现 2.相关结构体的实现 3.通讯录的初始化 4.新建联系人 5.显示所有联系人信息 6.删除联系人 7.查找指定联系人 8.修改联系人信息 9.对联系人进行排序 10.完整代码 既然是通讯录&#xff0c;我们要实现以下内容 …

内存泄漏调优案列

案列背景 最近在做公司项目核心接口压测和稳定性压测时&#xff0c;各接口的成功率不足99.99%&#xff0c;通过分割压测之后发现&#xff0c;在压测A服务时&#xff0c;内存上升明显&#xff0c;且伴有频繁的fgc发生 jvm老年代内存使用率已经达到了100%且应用的fgc有5000次&am…

离散数学与组合数学-02二元关系上

文章目录离散数学与组合数学-02二元关系上2.1 序偶和笛卡尔积2.1.1 有序组的定义2.1.2 笛卡儿积笛卡儿积的性质2.2 关系的定义2.2.1 二元关系定义与案例2.2.2 二元关系的数学符号定义案例枚举二元关系2.2.3 定义域和值域2.2.4 二元关系概念的推广2.3 关系的表示2.3.1 集合表示法…

RS-485/RS-422收发器芯片DP3085 兼容替代MAX3085EESA

什么是RS-485 典型的串行通讯标准是RS232和RS485&#xff0c;它们定义了电压,阻抗等&#xff0c;但不对软件协议给予定义。RS-485总线标准规定了总线接口的电气特性标准即对于2个逻辑状态的定义&#xff1a;正电平在2V&#xff5e;6V之间&#xff0c;表示一个逻辑状态&#xf…

【基于动态内存+文件操作】通讯录管理系统

前言 每一个项目文件的功能说明 打印基本菜单1.创建一个适合存放联系人信息的结构体和通讯录结构体2.初始化通讯录&#xff08;加载上次的联系人&#xff0c;检查容量是否充足&#xff09; 枚举常量内部内容 (1)增加联系人信息 (2)删除某个联系人信息 (3)查找联系人信息 …

CY5.5-Dextran Cy5.5菁染料标记葡聚糖

产品名称&#xff1a;荧光Cy5.5菁染料标记葡聚糖 英文名称&#xff1a;CY5.5-Dextran 外观状态&#xff1a;紫色粉末 质量&#xff1a;90% 荧光波长&#xff1a;684nm-710nm 溶解性Dextran葡聚糖&#xff08;右旋糖酐Dextran&#xff09;,是一类具支链葡萄糖高聚物&#xff0c;…

系分 - 案例分析 - 需求分析(FAST分析)

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 文章目录案例分析 - 需求分析&#xff08;FAST分析&#xff09;FAST1 范围定义2 问题分析鱼骨图帕累托图制定系统改进目标3 需求分析定义需求PIECES方法4 逻辑设计5 决策分析6 物理设计和集成/构造和测试/安装和发…

考虑写出一个不抛异常的swap 函数

目录 一.标准库中的swap函数 二.针对于非模板类&#xff0c;设计全特化的std::swap() 三.针对模板类 四.合理使用using 五.swap成员函数不能抛出异常 六.swap函数总结 一.标准库中的swap函数 在C11中有move函数&#xff0c;它可以是一个左值变为右值&#xff0c;在许多场…

mybatis进阶

Mybatis的各种查询功能 MyBatis的各种查询功能&#xff1a; * 1、若查询出的数据只有一条 * a>可以通过实体类对象接收 * b>可以通过list集合接收 * c>可以通过map集合接收 * 结果&#xff1a;{password123456, sex男, id3, age23, email12345qq.com, usernameadmin} …

STM32 按键模块化

文章目录前言一、按键的原理图二、按键的GPIO配置总结前言 本篇文章将继续带大家学习模块化编程&#xff0c;今天主要给大家讲解按键的模块化。 一、按键的原理图 我们可以看到按键分别接到了板子的PE3和PE4引脚。 按键的具体原理这里我就不多讲了&#xff0c;大家可以看我之…