IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 6、数码相框之网络编程 -> 正文阅读

[网络协议]6、数码相框之网络编程


参考文档

1、引入网络编程

问:我们为什么要引入网络编程呢?看看下面引入的例子。

答:我们的程序是在开发板上运行,以前 printf 打印信息从串口打印出来。如果有成百上千个设备要同时去测试的话,那就要接成百上千条串口线,太麻烦了。所以说用串口线打印,一个是麻烦,另外一个是不好管理。还有串口的打印非常慢,当应用程序加入了成百上千条串口打印之后,就会导致程序运行得非常慢。而我们发布一个程序之后,肯定会把这些打印信息去掉,就会导致你调试的程序和真正发布的程序效果是不一样的,就会掩盖很多的问题。 所以我们要引入网络编程,把打印信息通过网络传输到某一台机器上,在那台机器上观察。
在这里插入图片描述

2、网络通信介绍

网络通信实质上也是数据的传输,数据的传输三要素:目的长度

参与数据传输的两者称为服务器和客户端。可以通过 ftp 工具来了解。

服务器:被动地响应请求
客户端:主动地发起请求
在这里插入图片描述
TCP:有连接

假如网络环境非常地糟糕,怎么确定数据由 B 传给 A 了呢?
肯定有三次握手之类的验证,数据由 B 发送出去之后,还要确保数据被 A 收到。
A,B 不一定是两台电脑,而是指服务器程序,客户端程序。这两个程序可以在同一台电脑上, 也可以在不同电脑上。

UDP:无连接

B 把数据扔出去之后就不管了,数据能不能到达 A,B 不关心。
TCP,UDP 传输各有用途。对于控制命令,文件传输用 TCP;对于视频传输用 UDP。

在这里插入图片描述

3、普通程序和网络程序流程对比

普通程序:
在这里插入图片描述
网络TCP程序:
在这里插入图片描述

4、网络编程涉及函数

socket函数

参考资料为三期项目中的资源:
在这里插入图片描述
Linux下通过 man 2 socket 获得原型和介绍int socket(int domain, int type, int protocol);
参数1:domain
即协议域,又称为协议族(family)地址族,可选如下:
在这里插入图片描述
若选择,如AF_INET决定了要用ipv4地址(32位的)与端口号(16位的)的组合、AF_UNIX决定了要用一个绝对路径名作为地址。
参数2:type
在这里插入图片描述
参数3: protocol
在这里插入图片描述
总结:
在这里插入图片描述

bind函数

在这里插入图片描述

listen函数

在这里插入图片描述

accept函数

在这里插入图片描述

connect函数

在这里插入图片描述

5、创建子进程

在这里插入图片描述

6、编写TCP的server端代码

server端程序运行流程:

  • 1、服务器程序一开始调用socket()函数得到一个iSocketServer(类似于文件句柄),socket()没有任何信息;
  • 2、调用bind()函数来绑定IP的端口,服务器就会监测IP的端口;
  • 3、调用listen()函数来启动监测;
  • 4、调用accept()函数等待客户连接;
  • 5、一旦有客户端连接成功,就会使用fork()函数来创建一个子进程,程序运行到这里,fork复制出一个子进程 if(fork() == 0),子进程走这条分支,原来的进程走else这条分支(要记得收尸)。
    我们之前创建一个普通的应用程序是用open,我们这里用socket

6.1、通过socket来打开一个网络文件

Server端其实就是一个接收请求,所以我们需要通过socket打开一个文件:
在这里插入图片描述

6.2、bind 端口和ip

在这里插入图片描述
我们之前介绍bind函数的时候有几点要再次注意:由于考虑系统兼容性,我们用(struct sockaddr_in)来替代原来bind中的第二个参数,所以要重新定义一个结构体变量,并在调用bind时类型转换,另外这里指定了端口要做网络字节序的转换。

6.3、listen监听bind绑定的端口

在这里插入图片描述
这里指定了最多客户端连接的个数。

6.4、accpet函数

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
accept函数中的第二个参数和之前的bind函数一样,也是由于要考虑兼容性,所以换了结构体,但是这个结构体是用来保存客户端的信息,我们之后可以通过这个结构体来知道客户端的地址,第三个参数其实就是第二个参数的变量长度。

6.5、创建进程分别接收

我们在accpet成功之后就可以收发数据了,但是可能有多个客户端,所以我们这里用fork来创建子进程。
在这里插入图片描述

6.6、给子进程收尸

我们子进程结束之后,必须要父进程给子进程收拾:
在这里插入图片描述
这部分的资料可以在第三期的资料里面找到,僵尸进程百度百科
在这里插入图片描述
在这里插入图片描述

7、编译TCP的server端程序

代码在第 1 个 项 目 数 码 相 框 全 部 源 码 _ 图 片 _ 文 档 \ 源 码 ( 含 讲 课 过 程 中 即 时 编 写 的 文档)\09.socket\source\11.socket\tcp server.c中。
在这里插入图片描述

8、编写TCP的client端代码

client端程序运行流程:

  • 1、调用socket()函数得到一个句柄
  • 2、调用connect()函数连接到一个服务器上面去,这个connect函数中有一个结构体,其中有IP、端口、协议等等信息
  • 3、连接成功之后调用send()函数来发送数据

8.1、建立socket

在这里插入图片描述

8.2、建立connect连接

在这里插入图片描述
server端一样,用sockaddr_in来替换sockaddr并且初始化sockaddr_in,其中sockaddr_insin_addr我们在server端用。
在这里插入图片描述
表示接收客户端的任意地址,而这里我们是:
在这里插入图片描述
表示从命令行中传入的地址,并且把命令行中的ip地址字符串通过inet_aton转化为网络字节序:
在这里插入图片描述

8.3、发送数据给sever端

在这里插入图片描述
通过获取界面的输入。

9、编译TCP的client端程序

代码为:第 1 个 项 目 数 码 相 框 全 部 源 码 _ 图 片 _ 文 档 \ 源 码 ( 含 讲 课 过程 中 即 时 编 写 的 文档)\09.socket\source\11.socket\tcp中的client.c
在这里插入图片描述

10、测试TCP程序

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

11、UDP

UDP 代码见:第 1 个 项 目 数 码 相 框全 部 源 码 _ 图片 _ 文档 \ 源码 ( 含 讲 课 过 程 中 即 时 编 写 的 文档 ) \ 0 9 . s o c k e t \ s o u r c e \ 1 1 . s o c k e t \ u d p

UDP涉及系统调用:
在这里插入图片描述
UDP的server端程序运行流程:

  • 1、服务器程序一开始调用socket()函数得到一个iSocketServer(类似于文件句柄),socket()没有任何信息;
  • 2、调用bind()函数来绑定IP的端口,服务器就会监测IP的端口;
  • 3、调用recvform()函数来接收客户端传来的消息并打印出来。

UDP的client端程序运行流程:

  • 1、调用socket()函数得到一个句柄
  • 2、(可省略此条)调用connect()函数连接到一个服务器上面去,这个connect函数中有一个结构体,其中有IP、端口、协议等等信息
  • 3、连接成功之后调用send()函数来发送数据

12、测试UDP程序

在这里插入图片描述
在这里插入图片描述

13、UDP中client端不写 connect 函数

在 UDP 的网络编程中不需要建立连接,即使调用了 connect 函数,实质上也没有建立一个链路,只不过是把目的地址和 socket建立一个连接而已,之后可以用 send 函数发送数据。不调用 connect 函数的话,可以直接调用 sendto 函数发送数据。

代码见:第 1 个 项 目 数 码 相 框全 部 源 码 _ 图片 _ 文档 \ 源码 ( 含 讲 课 过 程 中 即 时 编 写 的 文档 ) \ 0 9 . s o c k e t \ s o u r c e \ 1 1 . s o c k e t \ u d p 2

  • UDP 调用 connect 函数,可以用 send 发送数据:
    在这里插入图片描述
  • UDP 不调用 connect 函数,不可以用 send 发送数据,要用 sendto 发送数据:
    在这里插入图片描述
    测试:
    在这里插入图片描述
  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-07-17 12:17:20  更:2021-07-17 12:18:33 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/26 22:56:12-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计