C/C++网络编程基础知识超详细讲解第二部分(系统性学习day12)

news2024/11/17 8:31:37

           懒大王感谢大家的关注和三连支持~      

目录

前言

一、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]));	//9000
	myself.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]));	//8888
	other.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]));  //8888
	myself.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]));	//9000
	other.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++网络编程基础知识超详细讲解第二部分的详解,懒大王就先分享到这里了,如果你认为这篇文章对你有帮助,请给懒大王点个赞点个关注吧,如果发现什么问题,欢迎评论区留言!!💕💕 

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

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

相关文章

OpenLayers实战,OpenLayers解析渲染TopoJson格式区划边界数据和实现鼠标经过高亮显示区划边界和文字

专栏目录: OpenLayers实战进阶专栏目录 前言 本章使用OpenLayers实现从vue项目中加载assets资源目录中的TopoJson格式数据,解析渲染TopoJson格式行政区划边界数据,并且实现鼠标经过区域高亮显示区划边界和文字的功能。 本章是综合应用,为方便大家理解代码,拆分为简单的…

强化学习中的值函数

一、值函数 几乎所有的强化学习算法都涉及到估计值函数——状态&#xff08;或状态-动作对&#xff09;的函数&#xff0c;这些函数估计代理处于给定状态&#xff08;或在给定状态下执行给定动作&#xff09;的好坏。这里的“好坏”概念是根据可以预期的未来奖励来定义的&#…

动手学深度学习 - 学习环境配置

学习环境配置 1、安装 Miniconda1.1 下载 miniconda31.2 环境变量配置1.3 安装成功测试1.4 配置文件1.5 使用conda创建、使用、删除环境1.6 conda 常用命令 2、使用 miniconda 安装 d2l2.1 下载 d2l 安装包2.2 安装 d2l 1、安装 Miniconda 参考&#xff1a; https://www.jb51.n…

云尘-JIS-CTF-VulnUpload

继续做渗透 一样给了c段 开扫 存在一个站点 去看看 扫一下吧 第一个flag出来了 存在robots.txt 去看看 admin 页面源代码 第二个flag和账号密码 登入 就一个上传点 这不明显死了哈哈哈哈哈哈哈 直接开喽 上传修改后缀一气呵成 发现只有success 但是我们刚刚robots存在uploa…

十五、redis的使用

目录 一、简介1.1 nosql介绍1.2 redis特性1.3 redis优势1.4 redis应用场景 二、安装2.1 Macos下安装2.2 Linux下安装2.4 客户端连接2.5 切换数据库 三、数据库操作3.1 string类型3.2 键的操作3.3 Hash类型3.4 list类型3.5 set类型3.6 zset类型 四、和python交互4.1 安装redis包…

3.2每日一题(定积分求抽水做工问题)

1、画图&#xff0c;把题目的容器画出来&#xff1a;球形容器&#xff0c;半径为R 2、根据容器的形状进行分析&#xff1a; 抽水的实质是不同深度的水抽出去走的位移是不一样的>抽水的过程 &#xff1a; &#xff08;1&#xff09;先考虑深度为 x到xdx 的薄层水抽出去做多少…

草料资料库丨2023年全国消防宣传月资料合集,免费下载

2023年11月9日是第32个全国消防日&#xff0c;国务院安委会办公室决定于11月份在全国开展消防宣传月活动&#xff0c;主题是“预防为主&#xff0c;生命至上”。 结合今年消防安全月相关要求&#xff0c;我们特邀 注册安全工程师 邵悦 为大家整理了2023年全国消防宣传月的资料…

2023-在mac下安装Homebrew的国内镜像

mac安装Homebrew的国内镜像 尝试使用其他下载源&#xff1a;GitHub 可能会受到访问限制&#xff0c;尝试使用其他镜像或下载源。您可以使用清华大学、中科大或阿里云的 Homebrew 镜像&#xff0c;以提高下载速度和可靠性。例如&#xff0c;可以使用阿里云的镜像来安装 Homebre…

myCobot 320 APP 控制技术案例

引言 机械臂是现代工业和科研领域中的重要工具&#xff0c;它们在制造业、医疗、农业、教育等多个领域都有广泛的应用。这些机器臂不仅可以进行精密操作&#xff0c;而且能够在人类无法进入的危险环境中工作&#xff0c;大大提高了工作效率和安全性。然而&#xff0c;传统的机械…

UE5 日记(人物连招:蒙太奇动画通知(含视频链接))

教程https://www.youtube.com/watch?vsWpENaVGj2M&listPLiSlOaRBfgkcPAhYpGps16PT_9f28amXi&index10&ppiAQB 相关蓝图 连招逻辑 动画通知类 逻辑分析 1.用户输入 已搭载战斗系统模块,可以收到输入指令 2.连击 第一次攻击&#xff1a; 第一次攻击&#xff0c;…

camtasia studio 2024功能介绍安装教程

Camtasia studio 2024是一款功能强大的屏幕录制和视频编辑软件。它可以帮助用户轻松地记录电脑屏幕上的任何操作&#xff0c;并可以将录制的视频进行编辑和制作成高质量的视频教程、演示文稿、培训课程等。 Camtasia studio 2024具有直观的界面和易于使用的工具&#xff0c;包…

springboot动态数据源【非伪数据源】

说明&#xff1a;本文章的数据源不是在配置文件中配置两个或多个数据源&#xff0c;在业务方面对这些数据源来回切换&#xff0c;本文章中的数据源是可以动态添加&#xff0c;修改&#xff0c;切换的&#xff0c;废话不多说。 先看工程图&#xff1a; 1.pom.xml文件 <?x…

第五章 I/O管理 三、I/O控制方式(程序直接控制、中断驱动方式、DMA方式、通道控制方式)

目录 一、程序直接控制方式 1、以读操作为例 2、CPU的干预 3、数据传送的单位 4、数据的流向 5、优点 6、缺点 二、中断驱动方式 1、定义&#xff1a; 2、CPU干预的频率 3、数据传送的单位 4、数据的流向 5、主要缺点和主要优点 优点: 缺点: 三、DMA方式&#x…

R语言使用surveyCV包对NHANES数据(复杂调查加权数据)进行10折交叉验证

美国国家健康与营养调查&#xff08; NHANES, National Health and Nutrition Examination Survey&#xff09;是一项基于人群的横断面调查&#xff0c;旨在收集有关美国家庭人口健康和营养的信息。 地址为&#xff1a;https://wwwn.cdc.gov/nchs/nhanes/Default.aspx 既往咱们…

世界前沿技术发展报告2023《世界航空技术发展报告》(六)航空动力技术

&#xff08;六&#xff09;航空动力技术 1.军用航空动力技术1.1 美国空军授出下一代自适应推进项目合同1.2 法国完成下一代战斗机发动机原型机地面测试1.3 美国通用电气公司为美国陆军测试首台T901涡轴发动机1.4 美国液体活塞公司研制高功重比重油发动机 2.民用航空动力技术2.…

这样刻《少年强则国强》也行……

孙溟㠭篆刻《少年强则国强 》 这是篆书&#xff0c;隶书&#xff0c;简化字刻法有点意思。 孙溟㠭篆刻《少年强则国强》

信息系统项目管理师教程 第四版【第7章-项目立项管理-思维导图】

信息系统项目管理师教程 第四版【第7章-项目立项管理-思维导图】 课本里章节里所有蓝色字体的思维导图

一文告诉你样机是什么,分享几个常用的样机模板

一个项目的诞生通常需要经历头脑构思、绘制设计和最终着陆。在这个过程中&#xff0c;样机制作往往是在着陆实践之前进行的。俗话说&#xff1a;“样机使用得好&#xff0c;草稿过早”。样机设计是产品或网站最终设计的生动、静态和视觉表现。它为用户提供了一种模拟现实的方式…

大语言模型有什么魅力?和生成式AI是一回事吗?亚马逊云科技可以告诉你

大语言模型和生成式AI有什么关系呢&#xff1f;大语言模型为什么这么火&#xff1f;一提到大语言模型&#xff0c;想必大家第一个想到的就是ChatGPT这样的自然语言处理工具&#xff0c;那么大语言模型是什么&#xff1f;大语言模型和生成式AI是什么关系&#xff1f;就让我以亚马…

HackerOne 已向白帽支付了超 3 亿美元漏洞赏金

知名网络安全公司HackerOne近日宣布&#xff0c;自2012年成立以来&#xff0c;其漏洞赏金计划已向白帽和漏洞研究人员发放了超 3 亿美元的奖励。 HackerOne提供了一个漏洞赏金平台&#xff0c;将企业与白帽的安全专业知识、资产发现、持续评估和流程增强相结合&#xff0c;以发…