嵌入式学习第二十六天!(网络传输:TCP编程、HTTP协议)

TCP通信:

    1. TCP发端:

        socket  ->  connect  ->  send  ->  recv  ->  close

    2. TCP收端:

        socket  ->  bind  ->  listen  ->  accept  -> recv  ->  send  ->  close

    3. TCP需要用到的函数:

        1. connect:

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

              功能:发送链接请求

              参数:

                  sockfd:套接字文件描述符

                  addr:目的地址存放空间首地址

                  addrlen:IP地址的大小

              返回值:

                   成功返回0
                   失败返回-1

        2. send:

ssize_t send(int sockfd, const void *buf, size_t len, int flags);

              功能:发送数据

              参数:

                  sockfd:文件描述符

                  buf:发送数据空间首地址

                  flags:属性默认为0

              返回值:

                  成功返回实际发送字节数
                  失败返回-1

        3. recv:

ssize_t recv(int sockfd, void *buf, size_t len, int flags);

                功能:接收数据

                参数:

                    sockfd:套接字文件描述符

                    buf:存放数据空间首地址

                    len:最大接收数据的长度

                    flags:属性,默认为0

                返回值:

                    成功返回实际接收字节数
                    失败返回-1 
                    如果对方退出,返回0 

        4. listen:

int listen(int sockfd, int backlog);

                功能:监听客户端发送的连接请求(该函数不会阻塞)

                参数:

                    sockfd:套接字文件描述符

                    backlog:允许等待的尚未被处理的三次握手请求的最大个数

                返回值:

                    成功返回0 
                    失败返回-1 

        5. accept:

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

                功能:处理等待连接队列中的第一个连接请求,该函数具有阻塞功能(如果没有人发送链接请求,会阻塞等待)

                参数:

                    socket:套接字文件描述符

                    address:存放IP地址的空间首地址

                    addrlen:存放IP地址大小空间首地址

                返回值:

                    成功返回一个新的文件描述符
                    失败返回-1

        4. TCP编程练习:

                1. 利用TCP实现跨主机的文件发送:

send.c

#include "head.h"

int main(void)
{
	FILE *fd = NULL;
	int sockfd = 0;
	int ret = 0;
	struct sockaddr_in severaddr;
	ssize_t nsize = 0;
	size_t rret = 0;
	char filename[100] = {0};
	char tmpbuff[1024] = {0};

	sockfd = socket(AF_INET, SOCK_STREAM, 0);
	if(sockfd == -1)
	{
		perror("fail to socket");
		return -1;
	}
	
	severaddr.sin_family = AF_INET;
	severaddr.sin_port = htons(50000);
	severaddr.sin_addr.s_addr = inet_addr("192.168.1.162");
	ret = connect(sockfd,(struct sockaddr *)&severaddr, sizeof(severaddr));
	if(ret == -1)
	{
		perror("fail to connect");
		return -1;
	}
	
	scanf("%s", filename);
	fd = fopen(filename, "r");
	if(fd == NULL)
	{
		perror("fail to fopen");
		return -1;
	}

	nsize = send(sockfd, filename, strlen(filename), 0);
	if(nsize == -1)
	{
		perror("fail to send");
		return -1;
	}

	while(1)
	{
		memset(tmpbuff, 0, sizeof(tmpbuff));
		rret = fread(tmpbuff, 1, sizeof(tmpbuff), fd);
		if(rret == 0)
		{
			break;
		}
		usleep(1000);
		nsize = send(sockfd, tmpbuff, rret, 0);
		if(nsize == -1)
		{
			perror("fail to send");
			return -1;
		}
		
	}
	
	fclose(fd);
	close(sockfd);

	return 0;

}

        在这里,nsize = send(sockfd, tmpbuff, rret, 0);中,必须使用rret作为发送的字节大小,不能用strlen(tmpbuff),因为如果是二进制文件,不是ASCII码文件,\0可能成为发送的内容,所以在这里rret作为读到的字节数,可以直接作为send的输入。

        其中在进行接收数据的时候,usleep(1000),是防止在TCP传输时出现的粘包现象,如果没有这段代码,那么接收端,接收的文件就会出现:内容和名字共同作为接收方所收到文件的文件名。为了防止这种粘包的情况,我们还可以在传输数据的时候,给数据加上帧头和帧尾,将文件名和数据内容分隔开。

recv.c

#include "head.h"

int main(void)
{
	FILE *fd = NULL;
	int ret = 0;
	int sockfd = 0;
	int contfd = 0;
	ssize_t nsize = 0;
	char *ptmp = NULL;
	char tmpbuff[1024] = {0};
	struct sockaddr_in serveraddr;

	serveraddr.sin_family = AF_INET;
	serveraddr.sin_port = htons(50000);
	serveraddr.sin_addr.s_addr = INADDR_ANY;

	sockfd = socket(AF_INET, SOCK_STREAM, 0);
	if(sockfd == -1)
	{
		perror("fail to socket");
		return -1;
	}


	ret = bind(sockfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr));
	if(ret == -1)
	{
		perror("fail to ret");
		return -1;
	}
	
	ret = listen(sockfd, 10);
	if(ret == -1)
	{
		perror("fail to listen");
		return -1;
	}

	contfd = accept(sockfd, NULL, NULL);
	if(contfd == -1)
	{
		perror("fail to accept");
		return -1;
	}

	nsize = recv(contfd, tmpbuff, sizeof(tmpbuff), 0);
	if(nsize == -1)
	{
		perror("fail to recv");
		return -1;
	}

	fd = fopen(tmpbuff, "w");
	if(fd == NULL)
	{
		perror("fail to fopen");
		return -1;
	}

	while(1)
	{
		memset(tmpbuff, 0, sizeof(tmpbuff));
		nsize = recv(contfd, tmpbuff, sizeof(tmpbuff), 0);
		if(nsize <= 0)
		{
			break;
		}
		fwrite(tmpbuff, 1, nsize, fd);
	}

	fclose(fd);
	close(contfd);
	close(sockfd);

	return 0;
}

   5. TCP包头:

        1. 序号:发送端发送数据的编号

        2. 确认号:已经确认接收到的数据的编号(只有当ACK为1时,确认好才有用)

        3. 第四行为首部长度:数据前面的称之为头部,6位标记位,每一个标记位占一位

                URG:紧急标志位        ACK:确认标记位       RST:断开连接标记位

                SYN:请求标记位,置1建立连接的过程

                FIN:结束标记位,置1释放连接的过程

                PSH:若置为1这一数据段不在缓存区里等待,直接优先处理

        4. 校验和:目的是保证数据完整性

        5. 注意:不要将确认序号Ack标志位ACK搞混了,确认方Ack=发起方Seq+1,两端配对

    6. TCP为什么安全可靠:

        1. 在通信前建立三次握手连接:SYN、SYN+ACK、ACK

        2. 在通信过程中通过序列号和确认号保障数据传输的完整性

                本次发送序列号:上次收到的确认号

                本次发送确认号:上次接收到的序列号+实际接收的数据长度

        3. 在通信结束时使用四次挥手连接保障数据传输的完整性

    7. UDP和TCP的区别:

        1. UDP和TCP都是传输层的协议

        2. UDP实现机制简单,资源开销小,不安全不可靠

        3. TCP实现机制复杂,资源开销大,安全可靠

        4. UDP是无连接、TCP有连接、UDP是以数据包形式传输、TCP是以流的方式传输

HTTP协议:

    1.URL:

        代表着是统一资源定位符,每个有效的 URL 都指向一个唯一的资源。这个资源可以是一个 HTML 页面等等。

        <协议>://<主机>:<端口>/<路径>

          协议  :HTTP   :80       TCP

          协议  :HTTPS :443     TCP

        主机:域名  ->  域名解析服务器  ->  IP地址

        端口:可以省,HTTP 80, HTTPS 443

        路径:想要获得对应的资源

    2. HTTP交互过程:

        1. 建立TCP连接

        2. 发送HTTP请求报文

        3. 回复HTTP请求报文

        4. 关闭TCP连接

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

excel函数

1.VLOOKUP(B2.[测试部门.xls]结果集!$A:$C,1,FALSE)

2023年第三届中国高校大数据挑战赛第二场赛题D题赛题:行业职业技术培训能力评价(成品论文 代码与思路 视频讲解)

赛题 中国是制造业大国&#xff0c;产业门类齐全&#xff0c;每年需要培养大量的技能娴熟的技术工人进入工厂。某行业在全国有多所不同类型&#xff08;如国家级、省级等&#xff09;的职业技术培训学校&#xff0c;进行 5 种技能培训。学员入校时需要进行统一的技能考核&…

node管理器 nvm

需求背景&#xff1a;如果出现多个项目 不同项目使用的node版本不一致 需要切换node版本 如果每次单独下载对应的node版本太过于麻烦&#xff0c;使用nvm可以下载多个node版本&#xff0c;通过nvm切换控制使用哪个node版本 nvm下载地址&#xff1a;https://github.com/coreybut…

0-13 - 准备:智能指针类和异常类

---- 整理自狄泰软件唐佐林老师课程 文章目录 1. 智能指针示例1.1 内存泄漏&#xff08;臭名昭著的Bug &#xff09;1.2 当代 C 软件平台中的智能指针1.3 智能指针的设计方案1.4 智能指针的使用军规1.5 编程实验&#xff1a;智能指针示例 2. 异常类构建2.1 现代 C 库必然包含充…

蜂窝物联:智慧畜牧养殖解决方案

我国是一个畜牧大国&#xff0c;在实现畜牧业发展的过程中&#xff0c;面临着企业生产管理水平低、政府监管薄弱、环境污染、行业数据资源分散等问题&#xff0c;阻碍了现代畜牧业的快速发展。 近年来&#xff0c;蜂窝物联针对畜牧业的发展现状&#xff0c;借助新一代物联网和…

华为OD七日集训第2期 - 按算法分类,由易到难,循序渐进,玩转OD

目录 一、适合人群二、本期训练时间三、如何参加四、七日集训第 2 期五、精心挑选21道高频100分经典题目&#xff0c;作为入门。第1天、逻辑分析第2天、字符串处理第3天、矩阵第4天、深度优先搜索dfs算法第5天、回溯法第6天、二分查找第7天、双指针 大家好&#xff0c;我是哪吒…

新闻媒体软文发布,提升企业宣传效果的最佳方法!

在新闻媒体上发布宣传效果确实很高&#xff0c;可以帮助企业提高宣传效果&#xff0c;为企业打开知名度。迅推客新闻媒体软文发布有很多优势。如果写软文推广公司&#xff0c;可以有很多方法&#xff0c;比如用软文推广公司产品&#xff0c;介绍公司产品的亮点&#xff0c;其实…

【QT+QGIS跨平台编译】之七十一:【QGIS_Analysis跨平台编译】—【qgsrastercalclexer.cpp生成】

文章目录 一、Flex二、生成来源三、构建过程一、Flex Flex (fast lexical analyser generator) 是 Lex 的另一个替代品。它经常和自由软件 Bison 语法分析器生成器 一起使用。Flex 最初由 Vern Paxson 于 1987 年用 C 语言写成。 “flex 是一个生成扫描器的工具,能够识别文本中…

一口气看完西汉210年历史

1、刘邦建国 公元前202&#xff0c;刘邦在垓下之战中击败楚王项羽&#xff0c;终结了历时7年的秦末大乱&#xff0c;建立西汉王朝。 西汉全盛时期地图 公元前201年&#xff0c;匈奴单于冒顿引兵攻打太原&#xff0c;异姓诸侯王之一的汉王信战败投降&#xff0c;刘邦被迫亲自率…

Python·算法·每日一题(3月12日) 删除链表的倒数第 N 个结点

题目 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5]示例 2&#xff1a; 输入&#xff1a;head [1], n 1 输出&#xff1a;[]示例…

server win搭建apache网站服务器+php网站+MY SQL数据库调用电子阅览室

一、适用场景&#xff1a; 1、使用开源的免费数据库Mysql&#xff1b; 2、自己建网站的发布&#xff1b; 3、使用php代码建网站&#xff1b; 4、使用windows server作为服务器&#xff1b; 5、使用apache作为网站服务器。 二、win server 中apache网站服务器搭建 &#xff0…

【v4l2】V4L2框架-videobuf2(二)

系列文章目录 【V4L2】V4L2框架简述 【V4L2】V4L2框架之驱动结构体 【V4L2】V4L2子设备 【V4L2】V4L2框架-media device 【V4L2】V4L2框架-videobuf2 文章目录 系列文章目录用户空间的操作/dev/video 节点与 videobuf2 联系编程注意事项 用户空间的操作 用户空间 stream 操作 …

【rk3229 android7.1.2 替换默认输入法】

问题平台描述 问题描述解决方法 郑重声明:本人原创博文&#xff0c;都是实战&#xff0c;均经过实际项目验证出货的 转载请标明出处:攻城狮2015 Platform: Rockchip CPU:rk3229 OS:Android 7.1.2 Kernel: 3.10 问题描述 国内客户&#xff0c;觉得安卓自带的输入法不好用&#x…

C语言从入门到熟悉------第二阶段

printf的用法 printf的格式有四种&#xff1a; &#xff08;1&#xff09;printf("字符串\n"); 其中\n表示换行的意思。其中n是“new line”的缩写&#xff0c;即“新的一行”。此外需要注意的是&#xff0c;printf中的双引号和后面的分号必须是在英文输入法下。双引…

如何选择满足业务需求的CRM系统?六大评估标准全解析!

任何企业在最终部署CRM管理系统前&#xff0c;都会经历一系列决断环节&#xff0c;例如是否要使用CRM、选择什么样的系统、前期投入是多少、预期的投资回报率等等。在挑选CRM系统这个环节&#xff0c;企业更是面临着大量的选择。市场上CRM厂商数量众多&#xff0c;产品宣传让人…

【Python】一文带你了解如何获取 Python模块 安装路径

【Python】一文带你了解如何获取 Python模块 安装路径 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; 希望得到您的订阅…

ICC2:function eco / premask eco参考脚本

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 相关文章链接: ICC2:修short参考脚本 eco_netlist -by_verilog -file eco.v -write_changes eco.tcl source eco tcl place_eco_cells -eco_change_cells -no_legalize place_eco_cells -eco_cha…

c++: 引用能否替代指针? 详解引用与指针的区别.

文章目录 前言1. 引用和指针的最大区别:引用不能改变指向2. 引用和指针在底层上面是一样的3. 引用和指针在sizeof面前大小不同4. 有多级指针,没有多级引用5.引用是引用的实体,指针会向后偏移同一个类型的大小 总结 前言 新来的小伙伴如果不知道引用是什么?可以看我的上一篇文…

应用方案 | D78040场扫描电路

一 描 述 D78040是一款场扫描电路&#xff0c;偏转电流可达1.7Ap-p&#xff0c;可用于中小型显示器。 二 特 点 1、有内置泵电源 2、垂直输出电路 3、热保护电路 4、偏转电流可达1.7Ap-p 三 基本参数 四 应用电路图 1、应用线路 2、PIN5脚输出波形如下&#…

java中数组的定义与使用

Java中的数组跟c语言的数组几乎不一样&#xff0c;我们要区分对待。在之后你就能理解到我为什么说这句话了。 1.java中数组的创建与初始化 数组的创建 如下&#xff0c;皆为数组的创建。 double[] a; int[] b; 创建时的[]里面绝对不能填数字。 数组的初始化 主要分为动态…