网络编程第一课
0voice第一课 https://github.com/0voice
今日学习:网络通信IO
网络通信的核心是通过系统提供的socket套接字实现的。socket和c语言中文件操作的本质类似,在c语言中,通过fopen、fclose、fread、fwrite实现了对文件的操作,socket类似于fopen函数,创建一个文件(即套接字),然后可以往该“文件”中写入相关的内容。socket包含三个参数,分别是协议族、文件类型和协议,返回值为fd,类似于fopen中的文件指针,通过fd对套接字进行io操作。
#include<sys/socket.h> //socket所需要的头文件sockfd = socket(AF_INET, SOCK_STREAM, 0);
创建了socket后,需要将该socket和对应的地址进行绑定,通信的本质在于不同的地址之间信息的传送,socket提供了一个接口,现在还需要该接口和某个具体的网络地址进行绑定才可以实现通信。
#include<netinet/in.h> //socketaddr_in 需要的头文件// 地址需要专用的结构体 struct socketaddr_in 来定义
// 其具体结构如下:struct sockaddr_in { sin_family; //协议族sin_port; //端口struct in_addr sin_addr; //IP地址
}
struch in_addr{s_addr;
}//在服务器端建立一个socketadd类型的地址
struct socketaddr_in server_addr;
server_addr.family = AF_INET; //使用ipv4协议族
server_addr.sin_addr.s_addr = htonl(INADDR_ANY); //自动获取本机的IP地址,并使用htonl转换格式
server_addr.sin_port = htons(2000); //要绑定的端口号,使用htons转换
获取到了通信地址和socket的fd后,需要将两个进行绑定。
//bind函数
//三个参数// sockfd : 创建socket后反回的fd号,即要绑定的“文件”
// servaddr: IP地址的指针 注意,要把sockaddr_in的指针类型,转换为socketaddr指针类型
//size: IP地址的大小,该参数可以用来判断属于哪个协议族。bind(sockfd, servaddr, size)
绑定之后,就可以监听该端口的信息了,使用listen函数
进入listen之后,就可以被连接了
//sockfd: 绑定后监听端口的对应的fd
//backlog:确定连接请求队列的长度,达到该数量后,新的请求不再接受。
listen(sockfd, 10);
连接之后,可以收到客户端的发送的信息,但是无法显示出来,所以需要accept函数--用于接收客户端发送的信息
//建立客户端
//返回的新套接字是专门用于和当前连接的客户端通信的,
//所有后续的读写操作都需要通过这个新的套接字进行,而原来的监听套接字(sockfd)继续监听新的连接请求。struct sockaddr_in clientaddr;
int clientfd = accept(sockfd, (struct sockaddr *)&clientaddr, sizeof(clientaddr));accept是阻塞的,即它会一直等待,直到有客户端连接请求。如果没有请求,程序将停留在此函数调用//通过recv()函数来接受信息
//buf:指向接收缓冲区的指针,用于存储从套接字读取到的数据
//len接收缓冲区的大小(以字节为单位)。recv() 会尝试最多读取 len 字节的数据
recv(int sockfd, void *buf, size_t len, int flags);
//返回值
//返回实际接收到的字节数(ssize_t),即读取的数据大小。
//如果返回值为 0,表示连接已关闭(对于流式套接字)。
注意sockfd 和 clientfd 的区别:只要bind之后,只有一个sockfd,代表监听的端口。
但是被监听的端口可能同时有很多客户端发送信息,对于每个服务端,都需要使用accept来重新建立一个socket套接字来传送信息,之后可以基于此fd进行recv和send操作。
int client_fd = accept(sockfd, (struct sockaddr *)&clientaddr, &len);
printf("accept finished!");char buffer[1024];
int count = recv(client_fd, buffer, sizeof(buffer), 0);
printf("recv: %s", buffer);
count = send(client_fd, buffer, count, 0);
print("send: %d", count);
recv更像是c语言文件操作中的fread;而send更像是fwrite函数。
总结:
网络io操作的流程如下:
首先建立socket的fd号,将该fd号与地址和端口进行bind;
服务器端可以根据此fd号对这个端口进行listen监听,并维系一个连接队列;
服务器端使用accept与不同的客户端进行连接,连接成功后生成新的socket的fd号,根据此fd号对其进行读/写(即recv和send)操作。
一些心得:
今天的课程涉及到了计算机网络里tcp相关的内容,操作系统中阻塞相关的内容。这些知识本身并不陌生,之前在课堂也都学习过,知识点都理解,只是上手代码,由于不是特别熟悉,还是有点吃力的,需要每一个函数都要去查,包括参数、返回值之类的,计划2小时学完,其实花了很久来上手,大概四小时左右,代码的实现看了两遍,结合gpt搞懂了。虽然时间久,还是很有成就感的。希望越来越熟悉,加快学习的速度。
相关文章:
网络编程第一课
0voice第一课 https://github.com/0voice 今日学习:网络通信IO 网络通信的核心是通过系统提供的socket套接字实现的。socket和c语言中文件操作的本质类似,在c语言中,通过fopen、fclose、fread、fwrite实现了对文件的操作,socket…...
玩转 Burp Suite (1)
内容预览 ≧∀≦ゞ 玩转 Burp Suite (1)声明Burp Suite 简介Dashboard(仪表盘)1. 默认任务管理2. 暂停任务3. 新建扫描任务4. 使用总结 Target(目标)1. SIte Map (站点地图)2. Scope(范围&#…...
【linux】(16)date命令
基本用法 date [OPTION]... [FORMAT]显示当前日期和时间 默认情况下,date 命令显示当前的日期和时间: date输出示例: Sun Jun 2 10:29:08 UTC 2024自定义日期和时间格式 可以使用 FORMAT 选项自定义输出格式。常用的格式选项包括&#…...
算法笔记:并查集
一、什么是并查集 并查集的逻辑结构是一个包含N个元素的集合,如图: 我们将各个元素划分为若干个互不相交的子集,如图: 二、并查集的基本操作 (一)初始化 初始化可以先将每个子集指向自己 //初始化int []…...
密码系统设计实验3-2
文章目录 《密码系统设计》实验实验项目实验三 密码模块实现4-6 学时实践要求(30 分) 《密码系统设计》实验 实验项目 实验序号实验名称实验学时数实验目的实验内容实验类型学生学习预期成果实验三密码模块实现6基于商用密码标准的密码模块的实现实现简…...
Spring Boot 与 Spring Cloud Alibaba 版本兼容对照
版本选择要点 Spring Boot 3.x 与 Spring Cloud Alibaba 2022.0.x Spring Boot 3.x 基于 Jakarta EE,javax.* 更换为 jakarta.*。 需要使用 Spring Cloud 2022.0.x 和 Spring Cloud Alibaba 2022.0.x。 Alibaba 2022.0.x 对 Spring Boot 3.x 的支持在其发行说明中…...
SVD 奇异值分解
SVD 是一种矩阵分解和降维的算法,通过分解矩阵找到奇异值,奇异值越大代表特征越重要。公式如下 A U Σ V T A U \Sigma V^T AUΣVT U : 左矩阵 ( m \times m ) Σ \Sigma Σ: 对角奇异值矩阵V:右矩阵( n \times n ) Sklearn 实现 S…...
C++设计模式-享元模式
动机(Motivation) 在软件系统采用纯粹对象方案的问题在于大量细粒度的对象会很快充斥在系统中,从而带来很高的运行时代价——主要指内存需求方面的代价。如何在避免大量细粒度对象问题的同时,让外部客户程序仍然能够透明地使用面向对象的方式来进行操作…...
AI加持,华为全屋智能品牌升级为“鸿蒙智家”
1.传统智能家居的困境:从便利到繁琐 近年来,智能家居因其便捷性和科技感受到消费者的青睐。然而,随着用户需求的多样化,传统智能家居的弊端逐渐显现: 设备连接复杂,品牌间兼容性不足,用户不得不…...
洛谷刷题之p1631
序列合并 题目入口 题目描述 有两个长度为 N N N 的单调不降序列 A , B A,B A,B,在 A , B A,B A,B 中各取一个数相加可以得到 N 2 N^2 N2 个和,求这 N 2 N^2 N2 个和中最小的 N N N 个。 输入格式 第一行一个正整数 N N N; 第二…...
uniapp前端开发,基于vue3,element plus组件库,以及axios通讯
简介 UniApp 是一个基于 Vue.js 的跨平台开发框架,旨在通过一次开发、编译后运行在多个平台上,如 iOS、Android、H5、以及小程序(微信小程序、支付宝小程序、百度小程序等)等。UniApp 为开发者提供了统一的开发体验,使…...
在Unity中实现物体动画的完整流程
在Unity中,动画是游戏开发中不可或缺的一部分。无论是2D还是3D游戏,动画都能为游戏增添生动的视觉效果。本文将详细介绍如何在Unity中为物体添加动画,包括资源的准备、播放组件的添加、动画控制器的创建以及动画片段的制作与调度。 1. 准备动…...
【云计算网络安全】解析 Amazon 安全服务:构建纵深防御设计最佳实践
文章目录 一、前言二、什么是“纵深安全防御”?三、为什么有必要采用纵深安全防御策略?四、以亚马逊云科技为案例了解纵深安全防御策略设计4.1 原始设计缺少安全策略4.2 外界围栏构建安全边界4.3 访问层安全设计4.4 实例层安全设计4.5 数据层安全设计4.6…...
【Andriod ADB基本命令总结】
笔者工作当中遇到安卓机器的数据访问和上传,特来简单总结一下常用命令。 1、ADB命令简介与安装 简介: ADB (Android Debug Bridge) 是一个强大的命令行工具,用于与 Android 设备进行交互,常用于开发、调试、测试以及设备管理等操作。它是 Android 开发工具包(SDK)的一部…...
ChatGPT如何辅助academic writing?
今天想和大家分享一篇来自《Nature》杂志的文章《Three ways ChatGPT helps me in my academic writing》,如果您的日常涉及到学术论文的写作(writing)、编辑(editing)或者审稿( peer review)&a…...
Day 27 贪心算法 part01
贪心算法其实就是没有什么规律可言,所以大家了解贪心算法 就了解它没有规律的本质就够了。 不用花心思去研究其规律, 没有思路就立刻看题解。 基本贪心的题目 有两个极端,要不就是特简单,要不就是死活想不出来。 学完贪心之后再去看动态规划,就会了解贪心和动规的区别。…...
使用Python实现目标追踪算法
引言 目标追踪是计算机视觉领域的一个重要任务,广泛应用于视频监控、自动驾驶、机器人导航、运动分析等多个领域。目标追踪的目标是在连续的视频帧中定位和跟踪感兴趣的物体。本文将详细介绍如何使用Python和OpenCV实现一个基本的目标追踪算法,并通过一…...
某科技研发公司培训开发体系设计项目成功案例纪实
某科技研发公司培训开发体系设计项目成功案例纪实 ——建立分层分类的培训体系,加强培训跟踪考核,促进培训成果实现 【客户行业】科技研发行业 【问题类型】培训开发体系 【客户背景】 某智能科技研发公司是一家专注于智能科技、计算机软件技术开发与…...
如何通过高效的缓存策略无缝加速湖仓查询
引言 本文将探讨如何利用开源项目 StarRocks 的缓存策略来加速湖仓查询,为企业提供更快速、更灵活的数据分析能力。作为 StarRocks 社区的主要贡献者和商业化公司,镜舟科技深度参与 StarRocks 项目开发,也为企业着手构建湖仓架构提供更多参考…...
Linux V4L2框架介绍
linux V4L2框架介绍 V4L2框架介绍 V4L2,全称Video for Linux 2,是Linux操作系统下用于视频数据采集设备的驱动框。它提供了一种标准化的方式使用户空间程序能够与视频设备进行通信和交互。通过V4L2接口,用户可以方便地实现视频图像数据的采…...
idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...
Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...
