【Linux】网络基础和socket(4)

news2025/4/25 18:32:37

1.网络通信(app\浏览器、小程序)

2.网络通信三要素:

IP:计算机在网络上唯一标识(ipv4:4个字段,每段最大255   IPV6:16进制)

端口:计算机应用或服务唯一标识   ssh提供远程安全连接的服务 22  端口范围:1-65535(系统默认服务占用了部分端口,所以我们自己定义的网络应用会选用10000之后的端口)

通信协议:通信双方约定的通信数据的规格

3.网络通信协议:TCP/IP簇

不是一个协议,是由非常多的网络通信协议构成的一整套协议,通常称为协议簇,我们所接触的网络通信应用层通常使用自定义协议

实现TCP/IP协议的软件称为协议栈(移植)

TCP/IP四层协议:应用层、传输层、网络层、数据链路层(OSI网络七层模型)

传输层协议:TCP、UDP区别,应用场景:

TCP:

  • 面向连接:先创建连接,才能通信
  • 通信可靠性高
  • 实时性(通信效率)较低
  • 流式传输,带来问题是粘包(分开两次发,但全合在一起)
  • 应用场景:适用于对安全性,可靠性要求较高的场景中

UDP:

  • 无连接:无需创建连接,就可以通信
  • 通信可靠性低,易丢失
  • 实时性(通信效率)较高
  • 数据包方式,每个数据包是分离的,不粘包
  • 通信用于对实时性要求较高的场景中

4.TCP通信过程:

建立连接(三次握手)

通信过程(反馈+重发

结束连接(四次挥手)

5.TCP编程相关API

5.1、TCP通信框架

(1)C/S(Client/Server,客户端 / 服务器)架构:

C端与S端分别是一套独立软件

  • 性能表现出色:客户端与服务器直接交互,能有效降低网络传输的数据量。在处理复杂业务逻辑和大量数据时,C/S 架构可充分利用客户端的硬件资源,运行速度更快,响应更及时。例如,大型的图形设计软件和专业的金融交易系统,采用 C/S 架构能提供流畅的操作体验。

  • 高度定制化:客户端程序可根据特定用户的需求进行深度定制,能实现复杂的用户界面和交互逻辑。比如,一些企业内部使用的生产管理系统,会根据企业的业务流程和操作习惯,定制独特的功能和界面。

  • 数据安全性高:客户端和服务器之间的数据传输可以采用加密协议,而且客户端程序可以对用户输入的数据进行严格的验证和过滤,减少了数据泄露和恶意攻击的风险。例如,银行的网上交易客户端,通过多种加密技术保障用户资金和交易信息的安全。

(2) B/S(Browser/Server,浏览器 / 服务器)
  • 易于部署和维护:由于客户端只需浏览器,无需安装专门的软件,系统的部署和更新都在服务器端完成,大大降低了维护成本和工作量。例如,企业的办公自动化系统升级时,管理员只需更新服务器端的程序,用户在下次访问时即可使用新功能。

  • 跨平台兼容性好:只要有浏览器,无论使用何种操作系统(如 Windows、Mac OS、Linux),用户都能访问系统。这使得 B/S 架构的应用程序具有更广泛的用户群体。比如,在线教育平台,学生可以使用不同操作系统的设备通过浏览器访问课程。

  • 可访问性强:用户只要有网络连接,就可以在任何地方使用浏览器访问系统,不受地域和设备的限制。例如,销售人员在外出拜访客户时,通过手机浏览器就能实时查询公司的产品信息和客户资料。

5.2、Socket:套接字,用于网络通信之用

主要有两类传输套接字,流式套接字SOCK_STREAM)和数据报套接字SOCK_DGRAM

流式套接字:基于 TCP 协议,适合对可靠性要求高、需要连续数据流的应用,如 HTTPSMTP 等协议

数据报套接字:基于 UDP 协议,无连接,适合发送小数据包且对可靠性要求不高的应用,如音频或视频应用程序。

5.3、网络

5.4、C/S函数实现

(1)创建socket

/*
    * domain域:决定使用什么地址协议(IPV4,IPV6)

                          IPV4使用“AF_INET        IPV6使用“ AF_INET6”
    * type类型:决定了什么通信协议(TCP/UDP)

                         SOCK_STREAM:字节流(流式传输)
    * protocol:一般为0,让系统自动选择
    * 返回值:正确返回非负整数,错误返回-1

*/
    int server_fd = socket(AF_INET, SOCK_STREAM, 0);

(2)绑定端口

//使用sockadd_in需要头文件,可以不写结构体进去

#include <arpa/inet.h>
#include <unistd.h>

//服务端Socket文件描述符,地址,地址结构体长度
    struct sockaddr_in addr = { 0 };
    addr.sin_family = AF_INET;//IPV4
    addr.sin_addr.s_addr = INADDR_ANY;//服务器IP地址(INADDR_ANY让系统选择当前网卡对应的IP地址)
    addr.sin_port = htons(10001);//服务器端口号
    int res= bind(server_fd, (struct sockaddr*)&addr, sizeof(addr));

struct sockaddr_in {

  short int sin_family; /* Internet地址族 */

  unsigned short int sin_port; /* 端口号 */

  struct in_addr sin_addr; /* Internet地址 */

  unsigned char sin_zero[8]; /* 添0(和struct sockaddr一样大小)*/

};

(3)开启监听(文件描述符、最大连接数)

res = listen(server_fd, 10);

(4)等待客户端连接

int client_fd = accept(server_fd, NULL, NULL);

 (5)等待接收客户端数据

int len = read(client_fd, recv, sizeof(recv));

(6)响应数据到客户端

write(client_fd, send, sizeof(send));

(7)关闭连接(服务端一般不关闭)

close(client_fd);

例子:使用套接字+进程实现客户端与服务端之间的通信

服务端:

#include <iostream>
#include <stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>

using namespace std;
int main()
{
    char recv[100] = { 0 };
    char response[200] = { 0 }; // 新的缓冲区用于存放格式化后的字符串
    //1.创建socket
    int server_id = socket(AF_INET, SOCK_STREAM, 0);
    if (server_id < 0)
    {
        perror("socket error");
        return -1;
    }
    //2.绑定端口
    struct sockaddr_in addr = { 0 };
    addr.sin_family = AF_INET;
    addr.sin_addr.s_addr = INADDR_ANY;
    addr.sin_port = htons(10001);
    int res = bind(server_id, (struct sockaddr*)&addr, sizeof(addr));
    if (res < 0)
    {
        perror("bind error");
    }
    //3.开启监听
    res = listen(server_id, 10);
    if (res < 0)
    {
        perror("listen error");
    }
    cout << "等待客户端连接..." << endl;
    while (1)
    {
        //4.等待客户端连接
        int client_id = accept(server_id, NULL, NULL);

        cout << "有新客户端连接 client_id" << client_id << endl;
        int fork_id = fork();
        if (fork_id == 0)
        {
            while (1)
            {
                bzero(recv, sizeof(recv));
                //5.等待接收客户端数据
                int len = read(client_id, recv, sizeof(recv));
                cout << "data=" << recv << endl;
                sprintf(response, "server: %s is got", recv); // 使用新的缓冲区,不然可能会出错
                cout << response << endl;

                //6.响应数据到客户端
                write(client_id, response, strlen(response)); // 发送格式化后的字符串
            }
        }
    }
    return 0;
}

客户端:

#include <iostream>
#include <stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>

using namespace std;
int main()
{
	char send[100] = { 0 };
	char recv[100] = { 0 };

	int client_id = socket(AF_INET, SOCK_STREAM, 0);
	if (client_id < 0)
	{
		perror("socket error");
	}

	while (1)
	{
		//连接
		struct sockaddr_in addr = { 0 };
		addr.sin_family = AF_INET;
		addr.sin_addr.s_addr = inet_addr("127.0.0.1");
		addr.sin_port = htons(10001);
		int res = connect(client_id, (struct sockaddr*)&addr, sizeof(addr));
		if (res < 0)
		{
			perror("connect12 error");
			sleep(5);
			continue;
		}
		cout << "连接成功服务端,client_id=" << client_id << endl;
		while (1)
		{
			bzero(send, sizeof(send));
			cout << "请输入请求:" << endl;
			cin >> send;
			if (strcmp(send, "ok") == 0)
			{
				break;
			}
			//发送请求
			write(client_id, send, sizeof(send));
			//读取反馈
			read(client_id, recv, sizeof(recv));
			cout << recv << endl;
		}
		close(client_id);

	}
	return 0;
}

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

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

相关文章

大数据可能出现的bug之flume

一、vi /software/flume/conf/dir_to_logger.conf配置文件 问题的关键: Dir的D写成了小写 另一个终端里面的东西一直在监听状态下无法显示 原来是vi /software/flume/conf/dir_to_logger.conf里面的配置文件写错了 所以说不是没有source参数的第三行的原因 跟这个没关系 …

图解Mysql原理之全局锁,表级锁,行锁了解吗?

前言 大家好&#xff0c;我是程序蛇玩编程。 Mysql中的锁大家都用过吗&#xff0c;那全局锁&#xff0c;表锁&#xff0c;行锁哪个用的频率最多呢? 正文 全局锁: 全局锁就是对整个数据库实例加锁。 MySQL 提供了一个加全局读锁的方法&#xff0c;命令是 Flush tables wi…

Java集成【邮箱验证找回密码】功能

目录 1.添加依赖 2.选择一个自己的邮箱&#xff0c;作为发件人角色。 3.编写邮箱配置【配置发件人邮箱】 4.编写邮箱配置类 5.编写controller业务代码 6.演示效果 7.总结流程 8.注意 结语 一.发送邮箱验证码 1.添加依赖 <!--导入邮箱依赖--> <dependency&g…

HarmonyOS 5.0应用开发——MVVM模式的应用

【高心星出品】 文章目录 MVVM模式的应用ArkUI开发模式图架构设计原则案例运行效果项目结构功能特性开发环境model层viewmodel层view层 MVVM模式的应用 MVVM&#xff08;Model-View-ViewModel&#xff09;模式是一种广泛用于应用开发的架构模式&#xff0c;它有助于分离应用程…

程序员鱼皮最新项目-----AI超级智能体教程(一)

文章目录 1.前言1.什么是AI大模型2.什么是多模态3.阿里云百炼平台介绍3.1文本调试展示3.2阿里云和dashscope的关系3.3平台智能体应用3.4工作流的创建3.5智能体编排应用 1.前言 最近鱼皮大佬出了一套关于这个AI 的教程&#xff0c;关注鱼皮大佬很久了&#xff0c;鱼皮大佬确实在…

【AI模型学习】双流网络——更强大的网络设计

文章目录 一 背景1.1 背景1.2 研究目标 二 模型2.1 双流架构2.2 光流 三 实验四 思考4.1 多流架构4.2 fusion策略4.3 fusion的early与late 先简单聊了双流网络最初在视频中的起源&#xff0c;之后把重点放在 “多流结构"和"fusion” 上。 一 背景 1.1 背景 Two-Str…

HarmonyOS:一多能力介绍:一次开发,多端部署

概述 如果一个应用需要在多个设备上提供同样的内容&#xff0c;则需要适配不同的屏幕尺寸和硬件&#xff0c;开发成本较高。HarmonyOS 系统面向多终端提供了“一次开发&#xff0c;多端部署”&#xff08;后文中简称为“一多”&#xff09;的能力&#xff0c;可以基于一种设计…

“在中国,为中国” 英飞凌汽车业务正式发布中国本土化战略

3月28日&#xff0c;以“夯实电动化&#xff0c;推进智能化&#xff0c;实现高质量发展”为主题的2025中国电动汽车百人会论坛在北京举办。众多中外机构与行业上下游嘉宾就全球及中国汽车电动化的发展现状、面临的挑战与机遇&#xff0c;以及在技术创新、市场布局、供应链协同等…

Java技术体系的主要产品线详解

Java技术体系的主要产品线详解 Java Card&#xff1a;支持Java小程序&#xff08;Applets&#xff09;运行在小内存设备&#xff08;如智能卡&#xff09;上的平台。 Java ME&#xff08;Micro Edition&#xff09;&#xff1a;支持Java程序运行在移动终端&#xff08;手机、P…

‌机器学习快速入门--0算力起步实践篇

在学习人工智能的过程中&#xff0c;显卡是必不可少的工具&#xff0c;但它的成本较高且更新换代速度很快。那么&#xff0c;没有GPU的情况下如何学习人工智能呢&#xff1f;以下是针对普通电脑与有算力环境分离的学习规划方案&#xff0c;尤其适合前期无GPU/云计算资源的学习者…

源码篇 剖析 Vue2 双向绑定原理

前置操作 源码代码仓地址&#xff1a;https://github.com/vuejs/vue/tree/main 1.查看源码当前版本 当前版本为 v2.7.16 2.Clone 代码 在【Code】位置点击&#xff0c;复制 URL 用于 Clone 代码 3.执行 npm install 4.执行 npm run dev 前言 在 Vue 中最经典的问题就是双…

单例模式与消费者生产者模型,以及线程池的基本认识与模拟实现

前言 今天我们就来讲讲什么是单例模式与线程池的相关知识&#xff0c;这两个内容也是我们多线程中比较重要的内容。其次单例模式也是我们常见设计模式。 单例模式 那么什么是单例模式呢&#xff1f;上面说到的设计模式又是什么&#xff1f; 其实单例模式就是设计模式的一种。…

STM32配置系统时钟

1、STM32配置系统时钟的步骤 1、系统时钟配置步骤 先配置系统时钟&#xff0c;后面的总线才能使用时钟频率 2、外设时钟使能和失能 STM32为了低功耗&#xff0c;一开始是关闭了所有的外设的时钟&#xff0c;所以外设想要工作&#xff0c;首先就要打开时钟&#xff0c;所以后面…

React 与 Vue:两大前端框架的深度对比

在前端开发领域&#xff0c;React 和 Vue 无疑是当下最受欢迎的两大框架。它们各自拥有独特的优势和特点&#xff0c;吸引了大量开发者。无论是初学者还是经验丰富的工程师&#xff0c;选择 React 还是 Vue 都是一个常见的问题。本文将从多个角度对 React 和 Vue 进行对比&…

Java24新增特性

Java 24&#xff08;Oracle JDK 24&#xff09;作为Java生态的重要更新&#xff0c;聚焦AI开发支持、后量子安全、性能优化及开发者效率提升&#xff0c;带来20余项新特性和数千项改进。以下是核心特性的分类解析&#xff1a; 一、语言特性增强&#xff1a;简化代码与模式匹配 …

Sentinel源码—6.熔断降级和数据统计的实现一

大纲 1.DegradeSlot实现熔断降级的原理与源码 2.Sentinel数据指标统计的滑动窗口算法 1.DegradeSlot实现熔断降级的原理与源码 (1)熔断降级规则DegradeRule的配置Demo (2)注册熔断降级监听器和加载熔断降级规则 (3)DegradeSlot根据熔断降级规则对请求进行验证 (1)熔断降级…

Volcano 实战快速入门 (一)

一、技术背景 随着大型语言模型&#xff08;LLM&#xff09;的蓬勃发展&#xff0c;其在 Kubernetes (K8s) 环境下的训练和推理对资源调度与管理提出了前所未有的挑战。这些挑战主要源于 LLM 对计算资源&#xff08;尤其是 GPU&#xff09;的巨大需求、分布式任务固有的复杂依…

用交换机连接两台电脑,电脑A读取/写电脑B的数据

1、第一步&#xff0c;打开控制面板中的网络和共享中心&#xff0c;如下图配置&#xff0c;电脑A和电脑B均要配置&#xff1b; 注意&#xff1a;要保证电脑A和电脑B在同一子网掩码下&#xff0c;不同的IP地址&#xff1b; 2、在电脑上同时按‘CommandR’&#xff0c;在弹出的输…

问道数码兽 怀旧剧情回合手游源码搭建教程(反查重优化版)

本文将对"问道数码兽"这一经典卡通风格回合制手游的服务端部署与客户端调整流程进行详细拆解&#xff0c;适用于具备基础 Windows 运维和手游源码调试经验的开发者参考使用。教程以实战为导向&#xff0c;基于原始说明内容重构优化&#xff0c;具备较高的内容查重避重…

WLAN共享给以太网后以太网IP为169.254.xx.xx以及uboot无法使用nfs下载命令的的解决方案

WLAN共享网络给以太网&#xff0c;实际上是把以太网口当作一个路由器&#xff0c;这个路由器的IP是由WLAN给他分配的&#xff0c;169.254.xx.xx是windows设定的ip&#xff0c;当网络接口无法从上一级网络接口获得ip时&#xff0c;该网络接口的ip被设置为169.254 &#xff0c;所…