当前位置: 首页 > news >正文

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特点&#xff1a; UDP框架: UDP函数学习 发送端代码案例如下&#xff1a; 二、多路复用 前提讲述 select poll 三、图解如下 总结 前言 作者简介&#xff1a; 懒大王敲代码&#xff0c;…...

【教3妹学编程-算法题】117. 填充每个节点的下一个右侧节点指针 II

2哥 : 3妹&#xff0c;听说你昨天去面试了&#xff0c;怎么样啊&#xff1f; 3妹&#xff1a;嗨&#xff0c;别提了&#xff0c;让我回去等通知&#xff0c;估计是没有通知了&#xff0c; 还浪费我请了一天假。 2哥 : 你又请假了啊&#xff0c; 你是怎么跟你那个严厉的老板请假…...

window10 mysql8.0 修改端口port不生效

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

欧盟网络安全威胁:虚假与错误信息

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

006 Linux 进程的概念 | 获取进程的PID

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

时序预测 | 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 的七层模型分别是&#xff1f;各自的功能是什么&#xff1f; 2. 为什么需要三次握手&#xff1f;两次不行&#xff1f; 3. 为什么需要四次挥手&#xff1f;三次不行&#xff1f; 4. TCP与UDP有哪些区别&#xff1f;各自应用场景&#xff1f; 5. HTTP1.0&#xff0c;1.1&…...

【CSS】CSS基础知识扫盲

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

React中的状态管理

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

【优选算法系列】【专题九链表】第一节.链表常用技巧和操作总结(2. 两数相加)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、链表常用技巧和操作总结二、两数相加 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 方式使用脚手架创建项目&#xff0c;vue cli处理&#xff0c; vue3后新的脚手架工具create-vue 使用npm init vuelatest 命令创建即可。 在pinia中&#xff0c;将使用的组合式函数识别为状态管理内容 自动将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学习日记(二)变量的使用--结合--温度换算/斐波那契数列--实例

前言&#xff1a; 这是一个系列的学习笔记&#xff0c;会将笔者学习Rust语言的心得记录。 当然&#xff0c;这并非是流水账似的记录&#xff0c;而是结合实际程序项目的记录&#xff0c;如果你也对Rust感兴趣&#xff0c;那么我们可以一起交流探讨&#xff0c;使用Rust来构建程…...

html各个标签的使用

一、标签的分类 1、单标签和双标签 1. 单标签&#xff1a;<img> img br hr 2. 双标签&#xff1a;<div></div> div span <a></a> h p a 2、按照标签属性分类 1. 块标签&#xff1a;自己独占一行 h1~h6 p div 2. 行内(内联)标签 …...

android 混淆

# 指定代码的压缩级别 0 - 7(指定代码进行迭代优化的次数&#xff0c;在Android里面默认是5&#xff0c;这条指令也只有在可以优化时起作用。) -optimizationpasses 5 # 混淆时不会产生形形色色的类名(混淆时不使用大小写混合类名) -dontusemixedcaseclassnames # 指定不去忽略…...

旋转链表(C++解法)

题目 给你一个链表的头节点 head &#xff0c;旋转链表&#xff0c;将链表每个节点向右移动 k 个位置。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], k 2 输出&#xff1a;[4,5,1,2,3]示例 2&#xff1a; 输入&#xff1a;head [0,1,2], k 4 输出&#xff1a;[…...

AcWing 134:双端队列

【题目来源】https://www.acwing.com/problem/content/description/136/【题目描述】 达达现在碰到了一个棘手的问题&#xff0c;有 N 个整数需要排序。 达达手头能用的工具就是若干个双端队列。 她从 1 到 N 需要依次处理这 N 个数&#xff0c;对于每个数&#xff0c;达达能做…...

别再怪BGA了!从X光图到金相分析,手把手教你排查PCB上那颗‘时好时坏’的芯片

从X光到金相切片&#xff1a;BGA虚焊故障的硬核排查指南 当你反复调试一块核心板时&#xff0c;那个诡异的BGA芯片就像在和你玩捉迷藏——用力按压时系统运行正常&#xff0c;松开手立刻故障重现。这种"时好时坏"的症状&#xff0c;往往让硬件工程师们抓狂。本文将带…...

2026 年 30 个 MCP Server 实测评:Claude Code 集成效果与响应延迟对比数据

1. 30个MCP Server实测评背后的真实问题:Claude Code不是“插上就快”,而是“配错就崩” 我上线第三个内部MCP Server时,CI流水线里一个原本2秒完成的代码补全请求,突然卡在waiting for MCP response状态长达17秒。日志里没有报错,只有反复重试的HTTP 504。排查了两天,最…...

如何快速掌握League-Toolkit:英雄联盟玩家的终极辅助工具指南

如何快速掌握League-Toolkit&#xff1a;英雄联盟玩家的终极辅助工具指南 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power &#x1f680;. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit League-Toolkit是一款…...

【STM32入门教程】将`printf`重定向到USART串口(以USB转串口为例)

【STM32入门教程】将printf重定向到USART串口&#xff08;以USB转串口为例&#xff09; 在STM32开发中&#xff0c;printf是一个非常方便的调试工具。但默认情况下&#xff0c;printf会输出到标准输出设备&#xff08;如屏幕&#xff09;&#xff0c;而在嵌入式系统中&#xff…...

ClaudeCodeOpenAI Token免费使用

2000万claude ops4.7 以及openai gpt5.5 token免费使用apikey贴在这里了:ops4.7sk-119f6d1b81af70e6018f5cf6eb6309261857c98a22280f27345a073c12560e2fgpt5.5sk-b013d9140497d3c7af94459a41f189e4013994f1fe8bac3d5a839e4bcf4413a9使用指南和文档在apikeyfun.com...

零基础想学挖漏洞?普通人也能看懂的网络安全入门学习路线(建议收藏)

很多人对网络安全的第一印象&#xff1a;黑客、代码、入侵、黑框代码疯狂滚动、随手就能让ATM吐钱&#xff0c;随手一个漏洞几千上万&#xff0c;日进斗金&#xff01;&#xff01;&#xff01; 但真实情况是&#xff1a;90%零基础新人不会挖漏洞&#xff0c;不是天赋不够&…...

告别BurpSuite自带Intruder的龟速:用Turbo Intruder插件30倍速爆破验证码(附Python脚本)

突破传统限制&#xff1a;Turbo Intruder在验证码爆破中的高效实践 在渗透测试和安全评估工作中&#xff0c;验证码爆破是一个常见但极具挑战性的任务。传统的BurpSuite Intruder模块虽然功能强大&#xff0c;但在处理高并发请求时往往显得力不从心&#xff0c;速度成为制约效率…...

【Python自动化】PyAutoGUI构建游戏稳定性测试守护脚本

1. PyAutoGUI在游戏测试中的核心价值 游戏稳定性测试往往需要长时间运行&#xff0c;人工值守既低效又容易遗漏异常。PyAutoGUI作为Python的GUI自动化利器&#xff0c;能完美模拟鼠标键盘操作&#xff0c;配合进程监控和图像识别&#xff0c;构建724小时无人值守的测试环境。我…...

MASA模组中文汉化包:让技术模组真正为你所用

MASA模组中文汉化包&#xff1a;让技术模组真正为你所用 【免费下载链接】masa-mods-chinese 一个masa mods的汉化资源包 项目地址: https://gitcode.com/gh_mirrors/ma/masa-mods-chinese 还在为Minecraft技术模组的英文界面而头疼吗&#xff1f;当你在使用Litematica进…...

Auto Edit 日常迭代踩坑实录:OpenAI Codex CLI 三种权限模式配置差异与 2 类高频报错修复

1. Auto Edit 模式不是“全自动”,而是最易失控的权限模式 大多数人第一次在项目里启用 codex cli --mode=auto-edit,是冲着“自动改代码”去的。我也是。直到某天凌晨两点,CI 流水线突然报出 17 个 test failure,而 git diff 显示——它把一个 if (user.role === admin) …...