lv7 嵌入式开发-网络编程开发 06 socket套接字及TCP的实现框架

news2024/11/18 21:35:33

目录

1 socket套接字

1.1 体系结构的两种形式

1.2 几种常见的网络编程接口

1.3 socket套接字

2 socket常用API介绍

2.1 API

2.2 地址族结构体

 2.3 套接字类型

2.4 socket套接字

3 TCP通信的实现过程

4 练习


1 socket套接字

1.1 体系结构的两种形式

  • 网络的体系结构 (Network Architecture) 是计算机网络的各层及其协议的集合,就是这个计算机网络及其构件所应完成的功能的精确定义(不涉及实现)
  • 实现 (implementation) 是遵循这种体系结构的前提下,用何种硬件或软件完成这些功能的问题

1.2 几种常见的网络编程接口

  • Berkeley UNIX 操作系统定义了一种 API,它又称为套接字接口 (socket interface)
  • 微软公司在其操作系统中采用了套接字接口  API,形成了一个稍有不同的 API,并称之为  Windows Socket
  • AT&T 为其 UNIX 系统 V 定义了一种 API,简写为 TLI (Transport Layer Interface)

1.3 socket套接字

2 socket常用API介绍

2.1 API

/*创建套接字*/
int socket(int domain, int type, int protocol);	

/*绑定通信结构体*/
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

/*监听套接字*/
int listen(int sockfd, int backlog);

/*处理客户端发起的连接,生成新的套接字*/
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

/*向服务器发起连接请求*/
int connect(int sockfd, const struct sockaddr *addr,  socklen_t addrlen);

三元组【IP地址,端口,协议】 

  • IP地址:标识计算机
  • 端口号:标识计算机当中的进程
  • 协议:指定数据传输的方式

2.2 地址族结构体

//通用地址族结构体

//sa_family
AF_UNIX      使用本地域套接字的地址结构,用于本地通信
AF_INET      使用IPv4的通信地址结构
AF_INET6     使用IPv6的通信地址结构
....

struct sockaddr {
    sa_family_t sa_family;
    char      sa_data[14];
}

struct sockaddr_in {
    sa_family_t sin_family;
    in_port_t sin_port;   //端口号
    struct in_addr sin_addr;  //IP地址结构体
};

struct sockaddr {
    uint32_t s_addr;     //IP地址结构体
};



//IPV6
struct sockaddr_in6 {
    sa_family_t sin6_family;
    in_port_t sin6_port;
    uint32_t sin6_flowinfo;
    struct in_addr sin_addr;
    uint32_t sin6_scope_id;
};

struct sockaddr {
    unsigned char s6_addr[16];
};



bind绑定中定义了一个通用结构体,通用结构体中可选IPV6、IPV4、本地,我们使用的 struct sockaddr_in或者struct sockaddr_in6可强制转换为通用结构体,以便适配不同结构体。其中ipv4、ipv6长度不一致,通过len参数区分。

 2.3 套接字类型

流式套接字 (SOCK_STREAM) 提供可靠的、面向连接的通信流;它使用TCP,从而保证数据传输的可靠性和顺序性

数据报套接字 (SOCK_DGRAM) 定义了一种不可靠、面向无连接的服务,数据通过相互独立的报文进行传输,是无序的,并且不保证是可靠、无差错的。它使用数据报协议UDP

原始套接字(SOCK_RAW) 允许直接访问底层协议,如IP或ICMP,它功能强大但使用较为不便,主要用于协议开发。

2.4 socket套接字

3 TCP通信的实现过程

建立连接 socket, bind, listen, accept

数据传送 read/write    recv/send

连接释放 close  shutdown

  • 通信之前,客户和服务器先创建套接字
  • 服务器端调用 bind,把端口号和本地 IP 地址填写到已创建的套接字中。
  • 服务器端调用 listen(收听),把套接字设置为被动方式,以便随时接受客户的服务请求。UDP 服务器不使用 listen 系统调用。
  • 服务器端调用 accept(接受),以便把远地客户进程发来的连接请求提取出来。UDP 服务器不使用 accept 系统调用
  • 客户进程调用 connect,以便和远地服务器建立连接(这就是主动打开)。
  • 客户和服务器在 TCP 连接上使用 write传送数据,使用 read接收数据。
  • 客户或服务器通信结束,调用 close 释放连接和撤销套接字。

4 练习

举例说明socket套接字常见API,及其功能

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

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

相关文章

想要精通算法和SQL的成长之路 - 二叉树的判断问题(子树判断 | 对称性 | 一致性判断)

想要精通算法和SQL的成长之路 - 二叉树的判断问题 前言一. 相同的树二. 对称二叉树三. 判断子树 前言 想要精通算法和SQL的成长之路 - 系列导航 一. 相同的树 原题链接 这题目典型的递归题: 如果两个节点都是null,我们返回true。如果两个节点一个nul…

【Linux】—— 详解软硬链接

前言: 本期,我将要给大家讲解的是有关 Linux下软硬链接的相关知识!!! 目录 前言 (一)理解硬链接 1.什么是硬链接 2.创建硬链接 3.硬链接的使用场景 (二)理解软链接…

麦田物语学习

设置预设 将对一个物体的操作保存下来,直接用于其他的物体,比较省力 当设置好一个物体后点击箭头所指的地方,保存预设,在其他物体的面板里点击预设使用 sprite renderer 图片渲染顺序参考点 修改游戏的渲染方式 修改为按照 y 轴…

操作系统学习笔记2

文章目录 1、进程管理逻辑图2、进程的由来 参考视频: 操作系统 1、进程管理逻辑图 2、进程的由来

芯驰D9评测(2)--系统环境配置连接

linux开发板的软件开发三件套: 建立连接-->建立交叉编译环境-->建立驱动开发环境。 如果我们不涉及镜像的深度定制,只是平台化应用的话 1. 建立串口连接 查看手册, 获取接口定义说明: 板载一共两个端子,三个…

python二次开发CATIA:文字轮廓草图

CATIA V5 版本的草图中,并没有文字轮廓的创建命令。通常的做法是,再Drawing 文件中创建所需文本-->将 Drawing 文件另存为 dwg / dxf 格式-->打开另存的文件,文字已转为轮廓线条-->复制线条并粘贴到草图中。 本例中,基于…

c#+Mysql房屋租赁管理系统

一、引言 随着房价的不断升高,人们对房屋的需求越来越难以满足,对于一些在外地工作的人来说租房子成为了一种常态,因此出现了越来越多的房屋中介,而对于房屋中介而言,管理日益增加租户的信息和房产的信息成了一个至关…

Hono——一个小型,简单且超快的Edges Web框架

Hono - [炎]在日语中的意思是火焰🔥 - 是一个小型,简单且超快的Edges Web框架。它适用于任何JavaScript运行时:Cloudflare Workers,Fastly ComputeEdge,Deno,Bun,Vercel,Netlify&…

【Leetcode】滑动窗口合集

这里写目录标题 209.长度最小的子数组题目思路代码 3. 无重复字符的最长子串(medium)题目思路 11. 最大连续 1 的个数 III题目思路 1658. 将 x 减到 0 的最⼩操作数题目思路代码 904. 水果成篮题目思路代码 438.找到字符串中所有字母的异位词题目思路代码…

政治与科技

作者:Hal Finney, 1994.1.2 今天政府可以禁书吗?当然不,至少在一个人将其输入或扫描到计算机中之后不能。技术成果是永久性的。政治手段只能作为一种战术武器,在技术解决方案到位之前阻止它们。如果你想改变世界,就不要…

Pytorch目标分类深度学习自定义数据集训练

目录 一,Pytorch简介; 二,环境配置; 三,自定义数据集; 四,模型训练; 五,模型验证; 一,Pytorch简介; PyTorch是一个开源的Python机…

python二次开发CATIA:为选中元素上色

先打开一个零件文档,然后用鼠标选中元素,再运行如下python程序: import win32com.client import pywintypes # 导入pywintypes模块 import random # 启动CATIA应用 catia win32com.client.Dispatch(CATIA.Application) catia.visible1try:…

在OpenWrt中配置使用FTP文件服务

安装:opkg install vsftpd 配置:vim /etc/vsftpd.conf 在其中增加一行:local_root/tmp 重启:service vsftpd restart

基于B2B平台的医疗病历交互系统

目录 前言 一、技术栈 二、系统功能介绍 医院管理 医院注册 医院文章 医生信息 医院注册 医疗安排 院区注册 医院公告 医院工作人员 病人病历 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 进入21世纪,计算机技术迅速向着网络化的、集…

pytorch最后一步安装失败显示false怎么办?

这两天在安装pytorch,可谓是吃了不少苦,安了整整一天才安装好。 本来按照安装步骤,一步一步都进行的很好,可是最后一步却显示false。 我的解决方案是,先更新显卡驱动(注意我的是英伟达显卡,安…

什么是向量嵌入?

一、说明 在所有关于生成式AI的讨论中,为生成式AI提供动力背后的概念可能有点压倒性。在这篇文章中,我们将重点介绍一个功能概念,它为人工智能的潜在认知能力提供支持,并为机器学习模型提供学习和成长的能力:向量嵌入。…

【C语言】浅谈代码运行效率及内存优化

【C语言】浅谈代码运行效率及内存优化 C语言作为一种高效率的编译语言 常用来写单片机等讲究时序性的设备 而只有代码优化得好 才能提高运行效率 当然这里的代码优化 并不是编译器优化 而是人为的代码习惯 文章目录 代码效率条件判断if else语句 抛弃边缘状态中断函数串口解析…

算法基础学习|排序

快速排序 模板 void quick_sort(int q[], int l, int r) {if (l > r) return;int i l - 1, j r 1, x q[l r >> 1];while (i < j){do i ; while (q[i] < x);do j -- ; while (q[j] > x);if (i < j) swap(q[i], q[j]);}quick_sort(q, l, j)&#xf…

希尔排序(C++实现)

文章目录 前言1. 基础概念2. 动图演示3. 代码实现4. 排序过程5. 效率分析6. 总结 前言 上篇文章讲了直接插入排序算法。 首先&#xff0c;在待排序的数组中&#xff0c;元素本身就是有序的情况下&#xff0c;就不需要移动任何元素&#xff0c;所以直接插入排序最好情况时间复…

Javascript 事件的动态绑定

动态绑定事件&#xff0c;是指在代码执行过程中&#xff0c;通过Javascript代码来绑定事件。这种技术可以大大增强网页的交互性和用户体验。上一期介绍的是通过事件监听器 EventListener 去实现元素颜色的变化。这一期将通过动态绑定方法去实现&#xff0c;对象.事件 匿名函数…