C/C++网络编程基础知识超详细讲解第二部分(系统性学习day12)
懒大王感谢大家的关注和三连支持~
目录
前言
一、UDP编程
UDP特点:
UDP框架:
UDP函数学习
发送端代码案例如下:
二、多路复用
前提讲述
select
poll
三、图解如下
前言
作者简介: 懒大王敲代码,正在学习嵌入式方向有关课程stm32,网络编程,数据结构C/C++等
今天给大家继续详细讲解网络编程基础知识,希望能够帮到大家!
欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖
一、UDP编程
UDP特点:
UDP的特点:不要连接,只管发送,数据因此不稳定,易丢包。
UDP与TCP不同之处:
1>没有服务器跟客户端的观念
2>没有accept和connect
3>UDP实际对于网络需求略高一点
UDP框架:
发送端 :
1>创建socket套接字
2>绑定自己的IP地址和端口号
3>声明别人的IP地址和端口号
4>发送数据(函数有变化)接收端:
1>创建socket套接字
2>绑定自己的IP地址和端口号
3>声明别人的IP地址和端口号
4>接收数据(函数有变化)
UDP函数学习
1>sendto
#include <sys/types.h>
#include <sys/socket.h>
int sendto(int sockfd, const void *buf, int len, unsigned int flags,
const struct sockaddr *dest_addr, int addrlen);
功能:
发送数据(用第五参数定位对方的IP地址和端口号)
参数:
sockfd:套接字
buf:发送缓冲区
len: 发送缓冲区的长度
flags:默认为0
dest_addr:结构体(包含目标的IP和端口号)
addrlen:结构体的长度
返回值:
成功返回发送字节数
失败,返回-1,并设置错误码
2>recvfrom
#include <sys/types.h>
#include <sys/socket.h>
int recvfrom(int sockfd, const void *buf, int len, unsigned int flags,
const struct sockaddr *src_addr, socklen_t *addrlen);
功能:
接收数据(用第五参数定位对方的IP地址和端口号)
参数:
sockfd:套接字
buf:接收缓冲区
len: 接收缓冲区的长度
flags:默认为0
src_addr:结构体(包含目标的IP和端口号)
addrlen:结构体的长度的指针
返回值:
成功返回接收字节数
失败,返回-1,并设置错误码
发送端代码案例如下:
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
int main(int argc,char *argv[])
{if(argc<5){printf("请输入<./可执行> <自己IP> <自己端口号> <目标IP> <目标端口号>\n");return -1;}//1>创建socket套接字int sfd;sfd = socket(AF_INET,SOCK_DGRAM,0);//注意换UDP类型if(sfd<0){perror("socket");return -1;}//2>绑定自己的IP和端口号struct sockaddr_in myself;myself.sin_family = AF_INET;myself.sin_port = htons(atoi(argv[2])); //9000myself.sin_addr.s_addr = inet_addr(argv[1]);if(bind(sfd,(struct sockaddr *)&myself,sizeof(myself))<0){perror("bind");return -1;}//3>声明别人的IP和端口号struct sockaddr_in other;other.sin_family = AF_INET;other.sin_port = htons(atoi(argv[4])); //8888other.sin_addr.s_addr = inet_addr(argv[3]);//4>发送数据char buf[50];while(1){bzero(buf,sizeof(buf));scanf("%s",buf);sendto(sfd,buf,strlen(buf),0,(struct sockaddr *)&other,sizeof(other));}close(sfd);return 0;
}
接收端代码案例如下:
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
int main(int argc,char *argv[])
{if(argc<5){printf("请输入<./可执行> <自己IP> <自己端口号> <目标IP> <目标端口号>\n");return -1;}//1>创建socket套接字int sfd;sfd = socket(AF_INET,SOCK_DGRAM,0);//注意换UDP类型if(sfd<0){perror("socket");return -1;}//2>绑定自己的IP和端口号struct sockaddr_in myself;myself.sin_family = AF_INET;myself.sin_port = htons(atoi(argv[2])); //8888myself.sin_addr.s_addr = inet_addr(argv[1]);if(bind(sfd,(struct sockaddr *)&myself,sizeof(myself))<0){perror("bind");return -1;}//3>声明别人的IP和端口号struct sockaddr_in other;other.sin_family = AF_INET;other.sin_port = htons(atoi(argv[4])); //9000other.sin_addr.s_addr = inet_addr(argv[3]);//4>接受数据char buf[50];int len = sizeof(other);while(1){bzero(buf,sizeof(buf));recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr *)&other,&len);printf("发送方说:%s\n",buf);}close(sfd);return 0;
}
二、多路复用
前提讲述
IO阻塞和IO非阻塞
int fcntl(int fd, int cmd, long arg); //改变文件描述符的特性
int flag;
flag = fcntl(sockfd, F_GETFL, 0);//F_GETFL获取文件描述符的特性
flag |= O_NONBLOCK;//配置非阻塞
fcntl(sockfd, F_SETFL, flag);//设置文件描述符特性为非阻塞
select
select
int select(int nfds, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, struct timeval *timeout);
功能:就是将你要关心的文件描述符放入一个集合中,将这个集合交给内核判断,当集合中
某个文件描述符被触发时,解除阻塞。
参数:
nfds:最大文件描述符+1
readfds:读集合
writefds:写集合
exceptfds:异常集合
timeout:超时时间
返回值:
成功返回那个被触发的文件描述符
失败,返回-1,并设置错误码
struct timeval {
long tv_sec; /* seconds */ 秒
long tv_usec; /* microseconds */ 微妙
};
void FD_ZERO(fd_set *fdset) 清除文件描述符集合
void FD_SET(int fd,fd_set *fdset) 将你要关心的文件描述符放入集合中
void FD_CLR(int fd,fd_set *fdset) 将文件描述符移除集合
int FD_ISSET(int fd,fd_set *fdset) 判断文件描述符是否在集合中
fd_set是一个数据类型,本质是一个字节数组。长度为1024.
readfds:读集合,往读集合放入我们关心的0,serfd描述符
当select解除阻塞,说明这两个文件描述符有一个被触发了。
一旦有文件描述符被触发,将移除集合中未触发的。再利用FD_ISSET去判断
poll
poll
#include <poll.h>
int poll(struct pollfd* fds, nfds_t nfds, int timeout)
功能:
多路复用,看哪个文件描述符就绪,做对应操作,看结构体第三参数是否被内核改变
参数:
fds:结构体数组,记
nfds:要判断的文件描述符个数
timeout:超时时间,0表示不阻塞;>0,阻塞的时间;默认设置为-1表示阻塞
返回值:
成功返回0
失败返回-1,并设置错误码
struct pollfd {
int fd; // 委托内核检测的文件描述符 你希望监听文件描述符0 用户设置
short events; // 委托内核检测文件描述符的什么事件 监听它被触发,也就是有数据可读POLLIN 用户设置
short revents // 文件描述符实际发生的事件 内核设置
}
三、图解如下
总结
关于C/C++网络编程基础知识超详细讲解第二部分的详解,懒大王就先分享到这里了,如果你认为这篇文章对你有帮助,请给懒大王点个赞点个关注吧,如果发现什么问题,欢迎评论区留言!!💕💕
相关文章:

C/C++网络编程基础知识超详细讲解第二部分(系统性学习day12)
懒大王感谢大家的关注和三连支持~ 目录 前言 一、UDP编程 UDP特点: UDP框架: UDP函数学习 发送端代码案例如下: 二、多路复用 前提讲述 select poll 三、图解如下 总结 前言 作者简介: 懒大王敲代码,…...

【教3妹学编程-算法题】117. 填充每个节点的下一个右侧节点指针 II
2哥 : 3妹,听说你昨天去面试了,怎么样啊? 3妹:嗨,别提了,让我回去等通知,估计是没有通知了, 还浪费我请了一天假。 2哥 : 你又请假了啊, 你是怎么跟你那个严厉的老板请假…...

window10 mysql8.0 修改端口port不生效
mysql的默认端口是3306,我想修改成3307。 查了一下资料,基本上都是说先进入C:\Program Files\MySQL\MySQL Server 8.0这个目录。 看看有没有my.ini,没有就新建。 我这里没有,就新建一个,然后修改port: […...

欧盟网络安全威胁:虚假与错误信息
如今,数字平台已是新闻媒体的主战地。社交网站、新闻媒体、甚至搜索引擎都是现在大多数人的信息来源。由于这些网站的运作方式是通过吸引人们来产生网站流量,这些抓人眼球的信息通常是推广广告,有些甚至没有经过审查。 国际现状 恶意攻击者现…...

006 Linux 进程的概念 | 获取进程的PID
前言 本文将会向您进程的概念,程序与进程的区别,如何获取进程的标识符-pid 文章重点 1.描述进程——PCB 进程与程序的区别 CPU对进程列表的处理 2.获取进程PID 描述进程-PCB 进程概念 课本概念:程序的一个执行实例或正在执行的程序 内核…...

时序预测 | Python实现ARIMA-CNN-LSTM差分自回归移动平均模型结合卷积长短期记忆神经网络时间序列预测
时序预测 | Python实现ARIMA-CNN-LSTM差分自回归移动平均模型结合卷积长短期记忆神经网络时间序列预测 目录 时序预测 | Python实现ARIMA-CNN-LSTM差分自回归移动平均模型结合卷积长短期记忆神经网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 时序预测 …...

《异常检测——从经典算法到深度学习》23 TimesNet: 用于常规时间序列分析的时间二维变化模型
zz# 《异常检测——从经典算法到深度学习》 0 概论1 基于隔离森林的异常检测算法 2 基于LOF的异常检测算法3 基于One-Class SVM的异常检测算法4 基于高斯概率密度异常检测算法5 Opprentice——异常检测经典算法最终篇6 基于重构概率的 VAE 异常检测7 基于条件VAE异常检测8 Don…...
计算机网络(59)
1. OSI 的七层模型分别是?各自的功能是什么? 2. 为什么需要三次握手?两次不行? 3. 为什么需要四次挥手?三次不行? 4. TCP与UDP有哪些区别?各自应用场景? 5. HTTP1.0,1.1&…...

【CSS】CSS基础知识扫盲
1、 什么是CSS? CSS即层叠样式表 (Cascading Style Sheets). CSS 能够对网页中元素位置的排版进行像素级精确控制, 实现美化页面的效果. 能够做到页面的样式和结构分离 2、 CSS引入方式 CSS代码编写的时候有多种引入方式: 内部样式、外部样式、内联样…...

React中的状态管理
目录 前言 1. React中的状态管理 1.1 本地状态管理 1.2 全局状态管理 Redux React Context 2. React状态管理的优势 总结 前言 当谈到前端开发中的状态管理时,React是一个备受推崇的选择。React的状态管理机制被广泛应用于构建大型、复杂的应用程序…...

【优选算法系列】【专题九链表】第一节.链表常用技巧和操作总结(2. 两数相加)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、链表常用技巧和操作总结二、两数相加 2.1 题目描述 2.2 题目解析 2.2.1 算法原理 2.2.2 代码编写总结 前言 一、链表常…...

上线Spring boot-若依项目
基础环境 所有环境皆关闭防火墙与selinux 服务器功能主机IP主机名服务名称配置前端服务器192.168.231.177nginxnginx1C2G后端服务器代码打包192.168.231.178javajava、maven、nodejs4C8G数据库/缓存192.168.231.179dbmysql、redis2C4G Nginx #配置Nginxyum源 [rootnginx ~]…...

pinia简单使用
新命令-创建vue3项目 vue create 方式使用脚手架创建项目,vue cli处理, vue3后新的脚手架工具create-vue 使用npm init vuelatest 命令创建即可。 在pinia中,将使用的组合式函数识别为状态管理内容 自动将ref 识别为stste,computed 相当于 ge…...

数据库进阶教学——数据库故障恢复(日志文件)
目录 一、日志简介 二、日志文件操作 1、查看日志状态 2、开启日志功能 3、查看日志文件 4、查看当前日志 5、查看日志中的事件 6、删除日志文件 7、查看和修改日志文件有效期 8、查看日志文件详细信息 三、删除的数据库恢复 一、日志简介 日志是记录所有数据库表结…...

Leetcode 73 矩阵置0
class Solution {//1.用矩阵的第一行和第一列来标记该行或该列是否应该为0,但是这样的话忽视了第一行或第一列为0的情况//2.用标记row0和column0来标记第一行或第一列是否该为0public void setZeroes(int[][] matrix) {int n matrix.length;int m matrix[0].length;boolean r…...

Rust学习日记(二)变量的使用--结合--温度换算/斐波那契数列--实例
前言: 这是一个系列的学习笔记,会将笔者学习Rust语言的心得记录。 当然,这并非是流水账似的记录,而是结合实际程序项目的记录,如果你也对Rust感兴趣,那么我们可以一起交流探讨,使用Rust来构建程…...
html各个标签的使用
一、标签的分类 1、单标签和双标签 1. 单标签:<img> img br hr 2. 双标签:<div></div> div span <a></a> h p a 2、按照标签属性分类 1. 块标签:自己独占一行 h1~h6 p div 2. 行内(内联)标签 …...
android 混淆
# 指定代码的压缩级别 0 - 7(指定代码进行迭代优化的次数,在Android里面默认是5,这条指令也只有在可以优化时起作用。) -optimizationpasses 5 # 混淆时不会产生形形色色的类名(混淆时不使用大小写混合类名) -dontusemixedcaseclassnames # 指定不去忽略…...

旋转链表(C++解法)
题目 给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。 示例 1: 输入:head [1,2,3,4,5], k 2 输出:[4,5,1,2,3]示例 2: 输入:head [0,1,2], k 4 输出:[…...
AcWing 134:双端队列
【题目来源】https://www.acwing.com/problem/content/description/136/【题目描述】 达达现在碰到了一个棘手的问题,有 N 个整数需要排序。 达达手头能用的工具就是若干个双端队列。 她从 1 到 N 需要依次处理这 N 个数,对于每个数,达达能做…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

C++--string的模拟实现
一,引言 string的模拟实现是只对string对象中给的主要功能经行模拟实现,其目的是加强对string的底层了解,以便于在以后的学习或者工作中更加熟练的使用string。本文中的代码仅供参考并不唯一。 二,默认成员函数 string主要有三个成员变量,…...
2025年低延迟业务DDoS防护全攻略:高可用架构与实战方案
一、延迟敏感行业面临的DDoS攻击新挑战 2025年,金融交易、实时竞技游戏、工业物联网等低延迟业务成为DDoS攻击的首要目标。攻击呈现三大特征: AI驱动的自适应攻击:攻击流量模拟真实用户行为,差异率低至0.5%,传统规则引…...

算法—栈系列
一:删除字符串中的所有相邻重复项 class Solution { public:string removeDuplicates(string s) {stack<char> st;for(int i 0; i < s.size(); i){char target s[i];if(!st.empty() && target st.top())st.pop();elsest.push(s[i]);}string ret…...

路由基础-路由表
本篇将会向读者介绍路由的基本概念。 前言 在一个典型的数据通信网络中,往往存在多个不同的IP网段,数据在不同的IP网段之间交互是需要借助三层设备的,这些设备具备路由能力,能够实现数据的跨网段转发。 路由是数据通信网络中最基…...

在Zenodo下载文件 用到googlecolab googledrive
方法:Figshare/Zenodo上的数据/文件下载不下来?尝试利用Google Colab :https://zhuanlan.zhihu.com/p/1898503078782674027 参考: 通过Colab&谷歌云下载Figshare数据,超级实用!!࿰…...
CppCon 2015 学习:REFLECTION TECHNIQUES IN C++
关于 Reflection(反射) 这个概念,总结一下: Reflection(反射)是什么? 反射是对类型的自我检查能力(Introspection) 可以查看类的成员变量、成员函数等信息。反射允许枚…...
虚幻基础:角色旋转
能帮到你的话,就给个赞吧 😘 文章目录 移动组件使用控制器所需旋转:组件 使用 控制器旋转将旋转朝向运动:组件 使用 移动方向旋转 控制器旋转和移动旋转 缺点移动旋转:必须移动才能旋转,不移动不旋转控制器…...

【多线程初阶】单例模式 指令重排序问题
文章目录 1.单例模式1)饿汉模式2)懒汉模式①.单线程版本②.多线程版本 2.分析单例模式里的线程安全问题1)饿汉模式2)懒汉模式懒汉模式是如何出现线程安全问题的 3.解决问题进一步优化加锁导致的执行效率优化预防内存可见性问题 4.解决指令重排序问题 1.单例模式 单例模式确保某…...