重头开始嵌入式第二十九天(Linux系统编程 网络通信 tcp)

本文主要是介绍重头开始嵌入式第二十九天(Linux系统编程 网络通信 tcp),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

1.常见网络模型

1.bs

2.p2p

3.cs

2.网络编程之TCP (传输控制协议)

1.TCP模型

2.服务器端:

1.socket();

2、bind();

3、listen();

4、accept();

5、接受函数:/发送函数:

6、close()  ===>关闭指定的套接字id;

3.客户端:

1.connect();

2、send()

3、客户端信息获取

4、客户端的信息bind

4.TCP 编程之三次握手 与 四次挥手

​编辑


1.常见网络模型

1.bs

BS(Browser/Server)网络通信模型即浏览器/服务器模式。
 
一、结构组成
 
在这种模型中,主要由客户端浏览器、服务器两部分组成。
 
1. 客户端:用户通过浏览器向服务器发送请求,如访问网页、提交表单等。浏览器负责显示服务器返回的结果,如网页内容、图像、视频等。
2. 服务器:接收客户端的请求,并进行相应的处理,然后将结果返回给客户端。服务器可以是 Web 服务器、应用服务器等,负责存储数据、处理业务逻辑等。
 
二、工作流程
 
1. 用户在浏览器中输入网址或点击链接,发起请求。
2. 浏览器将请求封装成特定的网络协议格式(如 HTTP),通过网络发送给服务器。
3. 服务器接收到请求后,根据请求的内容进行处理。如果是请求网页,服务器会从存储中读取相应的网页文件,并进行必要的动态生成(如果有动态内容)。
4. 服务器将处理后的结果(如网页内容)封装成网络协议格式,发送回客户端浏览器。
5. 浏览器接收到服务器的响应后,解析并显示结果。
 
三、优势
 
1. 易于部署和维护:客户端只需要有浏览器即可,无需安装专门的软件,降低了部署和维护的成本。
2. 跨平台性好:由于浏览器是跨平台的,所以 BS 模式可以在不同的操作系统上运行,如 Windows、Mac、Linux 等。
3. 集中管理数据:数据存储在服务器端,便于集中管理和备份,提高了数据的安全性。
4. 实时更新:服务器端可以随时更新数据和应用程序,客户端无需进行任何操作即可获取最新的内容。

2.p2p

P2P 即 Peer-to-Peer,中文为“对等网络”。
 
一、特点
 
1. 去中心化:P2P 网络中没有中心服务器,各个节点之间直接进行通信和资源共享,每个节点既是资源的提供者,又是资源的使用者。
2. 可扩展性强:随着节点的增加,网络的资源和服务能力也会相应增加,能够轻松应对大规模的用户需求。
3. 高容错性:由于没有中心节点,单个节点的故障不会影响整个网络的运行,具有较高的容错能力。
4. 资源丰富:用户可以从众多节点中获取各种类型的资源,如文件、视频、音乐等。
 
二、应用领域
 
1. 文件共享:如 BitTorrent、eMule 等软件,用户可以通过 P2P 网络共享和下载各种文件。
2. 流媒体:一些在线视频平台采用 P2P 技术来加速视频的播放,减少服务器的压力。
3. 分布式计算:将大型计算任务分解成多个小任务,分配给网络中的各个节点进行计算,提高计算效率。
4. 金融领域:P2P 借贷平台连接借款人和出借人,实现直接的资金借贷。
 
三、优势与挑战
 
优势:
 
1. 提高资源利用率,充分发挥各个节点的能力。
2. 降低对中心服务器的依赖,减少运营成本。
 
挑战:
 
1. 安全性问题,如恶意节点可能提供虚假资源或进行攻击。
2. 版权问题,在文件共享等应用中容易引发版权纠纷。
3. 网络管理难度较大,由于去中心化的特点,难以进行统一的管理和监控。

3.cs

CS(Client/Server)即客户端/服务器模式。

一、结构组成

由客户端和服务器两部分组成。

1. 客户端:安装在用户的设备上,通常提供用户界面,用于向服务器发送请求并接收服务器的响应。例如在电脑上安装的各种软件应用程序,如游戏客户端、办公软件等。

2. 服务器:通常是高性能的计算机系统,负责存储和管理数据、处理客户端的请求,并将结果返回给客户端。服务器可以同时为多个客户端提供服务。

二、工作流程

1. 客户端启动后,向服务器发送连接请求。

2. 服务器接收到请求后,建立与客户端的连接。

3. 客户端通过用户操作向服务器发送具体的业务请求,比如查询数据、保存数据等。

4. 服务器根据请求进行相应的处理,如从数据库中查询数据、进行数据计算等。

5. 服务器将处理结果返回给客户端。

6. 客户端接收结果并在用户界面上展示。

三、优势

1. 安全性较高:由于服务器可以对客户端进行认证和授权,能够更好地控制数据的访问权限,提高系统的安全性。

2. 响应速度快:对于一些复杂的业务处理,服务器可以利用其强大的计算能力快速响应客户端的请求。

3. 功能强大:可以根据具体的业务需求在客户端和服务器端分别实现不同的功能,提供更丰富的应用功能。

四、劣势

1. 部署和维护成本高:需要在每个客户端设备上安装软件,并且服务器的维护也需要专业人员进行。

2. 可扩展性受限:随着客户端数量的增加,服务器的性能可能会成为瓶颈,需要不断升级服务器硬件。

3. 跨平台性差:不同的操作系统可能需要开发不同版本的客户端软件。

2.网络编程之TCP (传输控制协议)

1.TCP模型

模式  C/S 模式  ==》服务器/客户端模型

server:socket()-->bind()--->listen()-->accept()-->recv()-->close()
client:socket()-->connect()-->send()-->close();
int on = 1;
setsockopt(listfd, SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on));


2.服务器端:

1.socket();


#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>

int socket(int domain, int type, int protocol);
功能:程序向内核提出创建一个基于内存的套接字描述符

参数:domain  地址族,PF_INET == AF_INET ==>互联网程序
  PF_UNIX == AF_UNIX ==>单机程序
  type    套接字类型:
     SOCK_STREAM  流式套接字 ===》TCP   
  SOCK_DGRAM   用户数据报套接字===>UDP
  SOCK_RAW     原始套接字  ===》IP
  protocol 协议 ==》0 表示自动适应应用层协议。

返回值:成功 返回申请的套接字id
失败  -1;


2、bind();

int bind(int sockfd, struct sockaddr *my_addr, 
             socklen_t addrlen);
功能:如果该函数在服务器端调用,则表示将参数1相关
  的文件描述符文件与参数2 指定的接口地址关联,
  用于从该接口接受数据。

  如果该函数在客户端调用,则表示要将数据从
  参数1所在的描述符中取出并从参数2所在的接口
  设备上发送出去。

  注意:如果是客户端,则该函数可以省略,由默认
        接口发送数据。
参数:sockfd 之前通过socket函数创建的文件描述符,套接字id
  my_addr 是物理接口的结构体指针。表示该接口的信息。

  struct sockaddr      通用地址结构
  {
  u_short sa_family;  地址族
  char sa_data[14];   地址信息
  };

  转换成网络地址结构如下:
  struct _sockaddr_in    ///网络地址结构
  {
  u_short    sin_family; 地址族
  u_short    sin_port;   ///地址端口
  struct in_addr  sin_addr;   ///地址IP
  char    sin_zero[8]; 占位
  };

  struct in_addr
  {
  in_addr_t s_addr;
  }

  socklen_t addrlen: 参数2 的长度。
返回值:成功 0
失败  -1;


3、listen();

  int listen(int sockfd, int backlog);
    功能:在参数1所在的套接字id上监听等待链接。
参数:sockfd  套接字id
  backlog 允许链接的个数。
返回值:成功  0
失败  -1;
 


4、accept();

int accept(int sockfd, struct sockaddr *addr, 
socklen_t *addrlen);
   功能:从已经监听到的队列中取出有效的客户端链接并
     接入到当前程序。
   参数:sockfd 套接字id
         addr  如果该值为NULL ,表示不论客户端是谁都接入。
     如果要获取客户端信息,则事先定义变量
   并传入变量地址,函数执行完毕将会将客户端
   信息存储到该变量中。
 addrlen: 参数2的长度,如果参数2为NULL,则该值
  也为NULL;
 如果参数不是NULL,&len;
  一定要写成len = sizeof(struct sockaddr);
   返回值:成功 返回一个用于通信的新套接字id;
    从该代码之后所有通信都基于该id

   失败  -1;


5、接受函数:/发送函数:


read()/write ()   ///通用文件读写,可以操作套接字。
recv(,0) /send(,0)      ///TCP 常用套机字读写
recvfrom()/sendto() ///UDP 常用套接字读写


ssize_t recv(int sockfd, void *buf, size_t len,
             int flags);
功能:从指定的sockfd套接字中以flags方式获取长度
  为len字节的数据到指定的buff内存中。
参数:sockfd  
如果服务器则是accept的返回值的新fd
如果客户端则是socket的返回值旧fd
  buff 用来存储数据的本地内存,一般是数组或者
  动态内存。
  len 要获取的数据长度
  flags 获取数据的方式,0 表示阻塞接受。

返回值:成功 表示接受的数据长度,一般小于等于len
失败  -1;
 


6、close()  ===>关闭指定的套接字id;


3.客户端:

1.connect();

nt connect(int sockfd, const struct sockaddr *addr,
                   socklen_t addrlen);
   功能:该函数固定有客户端使用,表示从当前主机向目标
     主机发起链接请求。
   参数:sockfd 本地socket创建的套接子id
         addr 远程目标主机的地址信息。
 addrlen: 参数2的长度。
   返回值:成功 0
       失败 -1;


2、send()

int send(int sockfd, const void *msg, 
size_t len, int flags);
   功能:从msg所在的内存中获取长度为len的数据以flags
     方式写入到sockfd对应的套接字中。

   参数:sockfd:
    如果是服务器则是accept的返回值新fd
如果是客户端则是sockfd的返回值旧fd

 msg 要发送的消息
 len 要发送的消息长度
 flags 消息的发送方式。

  返回值:成功  发送的字符长度
     失败  -1;


3、客户端信息获取


accept(fd,NULL,NULL);
参数2 是客户端信息,要获取该信息需要事先定义变量。

struct sockaddr_in cliaddr;
socklen_t len = sizeof(struct sockaddr);

accept(fd,(struct sockaddr*)&cliaddr,&len);

printf("cliaddr ip = %s \n",inet_ntoa(cliaddr.sin_addr));
pirntf("cliaddr port = %d\n",ntohs(cliaddr.sin_port));


4、客户端的信息bind


在socket()===>bind()===>connect();

struct sockaddr_in localaddr;

localaddr.sin_family = PF_INET;
localaddr.sin_port = htons(6666);///本地发送数据端口
localaddr.sin_addr.s_addr= inet_addr("192.168.1.100")  ///本机ip
socklen_t len = sizeof(struct sockaddr);

int ret = bind(fd,(struct sockaddr*)&localaddr,len);

4.TCP 编程之三次握手 与 四次挥手


1、TCP 是有连接的通信过程,需要三次握手建立链接。

两台主机之间的通信链路建立需要如下过程:

主机1  -----syn-----》主机2
主机1 《---ack syn--- 主机2
主机1  ----ack -----》主机2

四次挥手

主机1  --- F A ---》主机2
主机1 《---A ----- 主机2   主机1 不在发送消息,但是有可能接受消息

主机1 《---F A --- 主机2
主机1  ----A ----》主机2  主机1 2 全部完毕

94e54f4758ed41bd87aed45a5aa7ade0.png

这篇关于重头开始嵌入式第二十九天(Linux系统编程 网络通信 tcp)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1117829

相关文章

Linux磁盘分区、格式化和挂载方式

《Linux磁盘分区、格式化和挂载方式》本文详细介绍了Linux系统中磁盘分区、格式化和挂载的基本操作步骤和命令,包括MBR和GPT分区表的区别、fdisk和gdisk命令的使用、常见的文件系统格式以... 目录一、磁盘分区表分类二、fdisk命令创建分区1、交互式的命令2、分区主分区3、创建扩展分区,然后

Linux中chmod权限设置方式

《Linux中chmod权限设置方式》本文介绍了Linux系统中文件和目录权限的设置方法,包括chmod、chown和chgrp命令的使用,以及权限模式和符号模式的详细说明,通过这些命令,用户可以灵活... 目录设置基本权限命令:chmod1、权限介绍2、chmod命令常见用法和示例3、文件权限详解4、ch

Linux内核之内核裁剪详解

《Linux内核之内核裁剪详解》Linux内核裁剪是通过移除不必要的功能和模块,调整配置参数来优化内核,以满足特定需求,裁剪的方法包括使用配置选项、模块化设计和优化配置参数,图形裁剪工具如makeme... 目录简介一、 裁剪的原因二、裁剪的方法三、图形裁剪工具四、操作说明五、make menuconfig

Linux使用nohup命令在后台运行脚本

《Linux使用nohup命令在后台运行脚本》在Linux或类Unix系统中,后台运行脚本是一项非常实用的技能,尤其适用于需要长时间运行的任务或服务,本文我们来看看如何使用nohup命令在后台... 目录nohup 命令简介基本用法输出重定向& 符号的作用后台进程的特点注意事项实际应用场景长时间运行的任务服

什么是cron? Linux系统下Cron定时任务使用指南

《什么是cron?Linux系统下Cron定时任务使用指南》在日常的Linux系统管理和维护中,定时执行任务是非常常见的需求,你可能需要每天执行备份任务、清理系统日志或运行特定的脚本,而不想每天... 在管理 linux 服务器的过程中,总有一些任务需要我们定期或重复执行。就比如备份任务,通常会选在服务器资

TP-LINK/水星和hasivo交换机怎么选? 三款网管交换机系统功能对比

《TP-LINK/水星和hasivo交换机怎么选?三款网管交换机系统功能对比》今天选了三款都是”8+1″的2.5G网管交换机,分别是TP-LINK水星和hasivo交换机,该怎么选呢?这些交换机功... TP-LINK、水星和hasivo这三台交换机都是”8+1″的2.5G网管交换机,我手里的China编程has

Linux限制ip访问的解决方案

《Linux限制ip访问的解决方案》为了修复安全扫描中发现的漏洞,我们需要对某些服务设置访问限制,具体来说,就是要确保只有指定的内部IP地址能够访问这些服务,所以本文给大家介绍了Linux限制ip访问... 目录背景:解决方案:使用Firewalld防火墙规则验证方法深度了解防火墙逻辑应用场景与扩展背景:

Linux下MySQL8.0.26安装教程

《Linux下MySQL8.0.26安装教程》文章详细介绍了如何在Linux系统上安装和配置MySQL,包括下载、解压、安装依赖、启动服务、获取默认密码、设置密码、支持远程登录以及创建表,感兴趣的朋友... 目录1.找到官网下载位置1.访问mysql存档2.下载社区版3.百度网盘中2.linux安装配置1.

QT实现TCP客户端自动连接

《QT实现TCP客户端自动连接》这篇文章主要为大家详细介绍了QT中一个TCP客户端自动连接的测试模型,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录版本 1:没有取消按钮 测试效果测试代码版本 2:有取消按钮测试效果测试代码版本 1:没有取消按钮 测试效果缺陷:无法手动停

C#反射编程之GetConstructor()方法解读

《C#反射编程之GetConstructor()方法解读》C#中Type类的GetConstructor()方法用于获取指定类型的构造函数,该方法有多个重载版本,可以根据不同的参数获取不同特性的构造函... 目录C# GetConstructor()方法有4个重载以GetConstructor(Type[]