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

news2024/11/27 3:44:37

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

目录

前言

一、并发服务器

1.进程并发服务器

实例代码如下: 

2.线程并发服务器

实例代码如下: 

二、域通信

域通信TCP实例代码如下: 

三、广播与组播(UDP) 

1.广播

实例代码如下: 

 2.组播 

实例代码如下:

四、图解如下

 总结


前言

作者简介: 懒大王敲代码,正在学习嵌入式方向有关课程stm32,网络编程,数据结构C/C++等

今天给大家继续详细讲解网络编程基础知识,希望能够帮到大家!
欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💕 💕  💕 


一、并发服务器

1.进程并发服务器

消耗资源大,每连接进来一个客户端,你就要去开辟进程去服务那个客户端
            fork()
            举例:
                        if(fork()==0)  //子进程模块,不影响主进程中不断接收客户端连接
                        {
                            zhuanfa(&cfd);    
                        }

实例代码如下: 

#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>
// struct sockaddr_in client;
// int len = sizeof(client);

void *zhuanfa(void *arg)
{
	int ret;
	int fd = *(int *)arg;
	char buf[1024];//接信息
	char buf1[50] = "猖狂,北伐!";
	while(1)
	{

		bzero(buf,sizeof(buf));
		ret = recv(fd,buf,sizeof(buf),0);
		if(0 == ret)
		{
			printf("客户%d离开了\n",fd);
			close(fd);
			return NULL;
		}else
		 {
			printf("客户%d:%s\n",fd,buf); 
			// printf("客户%d进来了,IP地址为%s,端口号为%d\n",fd,inet_ntoa(client.sin_addr),ntohs(client.sin_port));
			send(fd,buf1,strlen(buf1),0); 
		 }	
	}
	return NULL;
}

int main(void)
{
	//socket
	int serfd = socket(AF_INET,SOCK_STREAM,0);
	if(0>serfd)
	{
		perror("socket");
		return -1;
	}
	//bind
	struct sockaddr_in ser;//netinet/in.h
	ser.sin_family = AF_INET;
	ser.sin_port = htons(8888);
	ser.sin_addr.s_addr = inet_addr("192.168.10.5");
	if(bind(serfd,(struct sockaddr *)&ser,sizeof(ser))<0)
	{
		perror("bind");
		return -1;
	}	
	//listen
	listen(serfd,8);
	//accept
	int cfd;
	pthread_t a;
	while(1)
	{
		//不断接受不同的客户端,并分配一个服务员给客户对接,在线程进行通信
		cfd = accept(serfd,NULL,NULL);//accept保存客户信息到client
		// pthread_create(&a,NULL,zhuanfa,&cfd);
		// pthread_detach(a);
		if(fork()==0)
		{
			zhuanfa(&cfd);	
		}
	}
	return 0;
}

2.线程并发服务器

占用资源资源比较小,代码维护起来困难
            pthread_create  //线程的创建
            pthread_detach    //给创建线程能自动收尸的能力 
            不自动:pthread_join
            
            printf("客户%d进来了,IP地址为%s,端口号为%d\n",fd,inet_ntoa(client.sin_addr),ntohs(client.sin_port));
            inet_ntoa(client.sin_addr) //网络二进制转回点分十进制
            ntohs(client.sin_port) //大端转小端

实例代码如下: 

#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>
struct sockaddr_in client;
int len = sizeof(client);
void *zhuanfa(void *arg)
{
	int ret;
	int fd = *(int *)arg;
	char buf[1024];//接信息
	char buf1[50] = "注意绿色上网!";
	while(1)
	{

		bzero(buf,sizeof(buf));
		ret = recv(fd,buf,sizeof(buf),0);
		if(0 == ret)
		{
			printf("客户%d离开了\n",fd);
			close(fd);
			return NULL;
		}else
		 {
			printf("客户%d:%s\n",fd,buf); 
			printf("客户%d进来了,IP地址为%s,端口号为%d\n",fd,inet_ntoa(client.sin_addr),ntohs(client.sin_port));
			send(fd,buf1,strlen(buf1),0); 
		 }	
	}
	return NULL;
}

int main(void)
{
	//socket
	int serfd = socket(AF_INET,SOCK_STREAM,0);
	if(0>serfd)
	{
		perror("socket");
		return -1;
	}
	//bind
	struct sockaddr_in ser;//netinet/in.h
	ser.sin_family = AF_INET;
	ser.sin_port = htons(8888);
	ser.sin_addr.s_addr = inet_addr("192.168.10.5");
	if(bind(serfd,(struct sockaddr *)&ser,sizeof(ser))<0)
	{
		perror("bind");
		return -1;
	}	
	//listen
	listen(serfd,8);
	//accept
	int cfd;
	pthread_t a;
	while(1)
	{
		//不断接受不同的客户端,并分配一个服务员给客户对接,在线程进行通信
		cfd = accept(serfd,(struct sockaddr *)&client,&len);//accept保存客户信息到client
		pthread_create(&a,NULL,zhuanfa,&cfd);
		pthread_detach(a);
		
	}
	return 0;
}

二、域通信

优点:没网情况下照样能用客户端与服务器代码测试,模仿TCP/UDP
局限性:不能跨主机,只用于网络环境苛刻下的代码测试
区别:
                域通信:
                    struct sockaddr_un        <sys/un.h>
                        struct sockaddr_un{
                            sa_family_t   sin_family;   //地址族
                            char     sun_path[108];      //s套接字的路径千万要用strcpy赋值
                        };
                    s套接字,在bind后运行执行文件它就出现

域通信TCP实例代码如下: 

服务器:

#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>
#include <sys/un.h>
#include <sys/select.h>
int main(void)
{
	//socket(变动)
	int sockfd = socket(AF_UNIX,SOCK_STREAM,0);//注意AF_UNIX
	if(0>sockfd)
	{
		perror("socket");
		return -1;
	}
	
	//bind(变动)
	struct sockaddr_un server;
	server.sun_family = AF_UNIX;
	strcpy(server.sun_path,"DJ");
	bind(sockfd,(struct sockaddr *)&server,sizeof(server));
	
	//listen
	listen(sockfd,8);
	
	//多路复用select
	int max = 0;
	int ret,cfd;//标志
	fd_set rfds;//读集合
	char buf[30];
	while(1)
	{
		FD_ZERO(&rfds);
		FD_SET(0,&rfds);
		FD_SET(sockfd,&rfds);
		max = sockfd;
		if(cfd>sockfd)//第一遍还没连接,这个判断没有作用
		{
			max=cfd;
			FD_SET(cfd,&rfds);
		}
		select(max+1,&rfds,NULL,NULL,NULL);
		if(FD_ISSET(0,&rfds))
		{
			bzero(buf,sizeof(buf));
			printf("0文件描述符触发\n");
			scanf("%s",buf);
			printf("键盘输入:%s\n",buf);
			if(cfd>3)//说明有人连接,改变了cfd一开始的值
			{
				send(cfd,buf,strlen(buf),0);
			}
		}else if(FD_ISSET(sockfd,&rfds))
		 {
			 cfd = accept(sockfd,NULL,NULL);
			if(0>cfd)
			{
				perror("accept");
				return -1;
			}
			 printf("有客户连接进来了!\n");
		 }else
		  {
			  bzero(buf,sizeof(buf));
			  ret = recv(cfd,buf,sizeof(buf),0);
			  if(0 == ret)
			  {
				perror("recv");
				return -1; 
			  }else
			   {
				   printf("客户说:%s\n",buf);
			   } 
		  }
	}

	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>
#include <sys/un.h>
void *(recv_msg)(void *arg)
{
	int ret;
	int fd = *(int *)arg;
	char buf[50];
	while(1)
	{
		bzero(buf,sizeof(buf));
		ret = recv(fd,buf,sizeof(buf),0);
		if(0>ret)
		{
			perror("recv");
			return NULL;
		}else if(0 == ret)
		 {
			 printf("服务器离开了\n");
			 return NULL;
		 }else
			 printf("服务器说:%s\n",buf);
	}
	return NULL;
}
int main(int argc,char *argv[])
{
	//变量区
	int clifd,ret;
	char buf[1024];
	pthread_t pid;
	
	//1>进行传参错误判断
	if(argc<2)//你运行时输入的个数   ./x a b 
	{
		printf("请输入<./可执行> <S_name> \n");	
		return -1;
	}
	//2>创建socket套接字
	clifd = socket(AF_UNIX,SOCK_STREAM,0);
	if(clifd<0)
	{
		perror("socket");
		return -1;
	}
	printf("创建出的socket的值为%d\n",clifd);
	//3>声明s套接字
	struct sockaddr_un server;
	server.sun_family = AF_UNIX;
	strcpy(server.sun_path,(argv[1]));
#if 0
	if(bind(clifd,(struct sockaddr *)&server,sizeof(server))<0)
	{
		perror("bind");
		return -1;
	}

	//4>监听
	if(listen(clifd,8)<0)
	{
		perror("listen");
		return -1;
	}
	printf("监听已启动,保护服务器中^-^\n");
#endif
	//5>主动连接服务器
	if(connect(clifd,(struct sockaddr *)&server,sizeof(server))<0)
	{
		perror("connect");
		return -1;
	}
	printf("成功连接!\n");
	//开辟线程
	pthread_create(&pid,NULL,recv_msg,&clifd);
	pthread_detach(pid);
	
	//6>收发数据
	while(1)
	{
		bzero(buf,sizeof(buf));
		scanf("%s",buf);
		send(clifd,buf,strlen(buf),0);
	}
	//7>关闭套接字
	close(clifd);
	return 0;
}

补充说明: 

 注意:如果bind的错误提示,说地址已经占用
                    就用remove();清掉自己绑定的s套接字,再运行就没有
                    AF_UNIX 
                        进程间通信有七种
                            早期:
                                1>无名管道
                                2>有名管道
                                3>信号
                            系统:
                                4>消息队列
                                5>共享内存
                                6>信号量
                            网络编程:
                                7>s套接字
                正常:
                    struct sockaddr_in
                    网络属性(IP地址和端口号)
                    AF_INET

三、广播与组播(UDP) 

1.广播

          看图
        允许发送的广播的属性怎么设置
            #include<sys/types.h>
            #include<sys/socket.h>
            setsockopt
                int setsockopt(int sockfd,int level,int optname,const void * optval,socklen_t optlen);
                功能:
                    设置套接字的属性
                参数:
                    sockfd:套接字
                    level:等级
                    optname:属性名字
                    optval:属性的值
                    optlen:属性的长度
                返回值:
                    成功为0
                    失败返回-1,并设置错误码
            举例:
                1>允许发送的广播的属性
                int on = 1;//1>为生效值,0>不生效
                setsockopt(sockfd,SOL_SOCKET,SO_BROADCAST,&on,sizeof(on));
                2>允许重复用
                int on = 1;//1>为生效值,0>不生效
                setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on)) 

实例代码如下: 

sendto:

#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>
#include <sys/un.h>
int main(void)
{
	int sockfd = socket(AF_INET,SOCK_DGRAM,0);
	if(0>sockfd)
	{
		perror("socket");
		return -1;
	}
	//设置发送广播属性
	int on = 1;//1>为生效值,0>不生效
	setsockopt(sockfd,SOL_SOCKET,SO_BROADCAST,&on,sizeof(on));
	
	struct sockaddr_in gb;
	gb.sin_family = AF_INET;
	gb.sin_port = htons(10086);
	gb.sin_addr.s_addr = inet_addr("192.168.10.255");
#if 0
	if(bind(sockfd,(struct sockaddr *)&gb,sizeof(gb))<0)
	{
		perror("bind");
		return -1;
	}
#endif	
	char buf[1024];
	// int addrlen = sizeof(gb);
	while(1)
	{
		bzero(buf,sizeof(buf));
		scanf("%s",buf);
		sendto(sockfd,buf,sizeof(buf),0,(struct sockaddr *)&gb,sizeof(gb));
		// printf("广播:%s\n",buf);
	}
	return 0;
}

 recvfrom:

#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>
#include <sys/un.h>
int main(void)
{
	int sockfd = socket(AF_INET,SOCK_DGRAM,0);
	if(0>sockfd)
	{
		perror("socket");
		return -1;
	}
	
	struct sockaddr_in gb;
	gb.sin_family = AF_INET;
	gb.sin_port = htons(10086);
	gb.sin_addr.s_addr = inet_addr("192.168.10.255");
	if(bind(sockfd,(struct sockaddr *)&gb,sizeof(gb))<0)
	{
		perror("bind");
		return -1;
	}
	
	char buf[1024];
	int addrlen = sizeof(gb);
	while(1)
	{
		bzero(buf,sizeof(buf));
		recvfrom(sockfd,buf,sizeof(buf),0,(struct sockaddr *)&gb,&addrlen);
		printf("广播:%s\n",buf);
	}
	return 0;
}

 2.组播 

特定的广播,进一步细化成员
            看图
            多播组只有一个人,为单播;人多,就多播。
            
            optval,————》ip-mreq{}     //与stuct sockaddr_in一个头文件netinet/in.h
            struct ip_mreq 
            {
                 struct  in_addr  imr_multiaddr;    //    组播地址    
                 struct  in_addr  imr_interface;    //自己linux的ip地址
            };
            struct in_addr{
                In_addr_t  s_addr;    //32位IPv4地址
            };
            举例:加入多播组
            struct ip_mreq zb;
            zb.imr_multiaddr.s_addr = inet_addr("233.233.233.233");
            zb.imr_interface.s_addr = inet_addr("192.168.10.5");
            setsockopt(sockfd,IPPROTO_IP,SO_ADD_MEMBERSHIP,&zb,sizeof(zb)); 

实例代码如下:

#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>
#include <sys/un.h>
int main(void)
{
	//1.socket
	int sockfd = socket(AF_INET,SOCK_DGRAM,0);
	if(0>sockfd)
	{
		perror("socket");
		return -1;
	}
	//2.运行发送广播
	int on = 1;//1>为生效值,0>不生效
	setsockopt(sockfd,SOL_SOCKET,SO_BROADCAST,&on,sizeof(on));
	//3.声明组播地址
	struct sockaddr_in zb;
	zb.sin_family = AF_INET;
	zb.sin_port = htons(9898);
	zb.sin_addr.s_addr = inet_addr("233.233.233.233");
	// if(bind(sockfd,(struct sockaddr *)&zb,sizeof(zb))<0)
	// {
		// perror("bind");
		// return -1;	
	// }
	//3.加入多播组
	// struct ip_mreq zb;
	// zb.imr_multiaddr.s_addr = inet_addr("233.233.233.233");
	// zb.imr_interface.s_addr = inet_addr("192.168.10.5");
	// setsockopt(sockfd,IPPROTO_IP,SO_ADD_MEMBERSHIP,&zb,sizeof(zb));
	//4.接收数据
	char buf[30];
	// int len = sizeof(zb);
	while(1)
	{
		bzero(buf,sizeof(buf));
		scanf("%s",buf);
		sendto(sockfd,buf,sizeof(buf),0,(struct sockaddr *)&zb,sizeof(zb));
		// printf("S:%s\n",buf);
	}
	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>
#include <sys/un.h>
int main(void)
{
	//1.socket
	int sockfd = socket(AF_INET,SOCK_DGRAM,0);
	if(0>sockfd)
	{
		perror("socket");
		return -1;
	}
	//2.bind组播地址
	struct sockaddr_in zb;
	zb.sin_family = AF_INET;
	zb.sin_port = htons(9898);
	zb.sin_addr.s_addr = inet_addr("233.233.233.233");
	if(bind(sockfd,(struct sockaddr *)&zb,sizeof(zb))<0)
	{
		perror("bind");
		return -1;	
	}
	//3.加入多播组
	struct ip_mreq db;
	db.imr_multiaddr.s_addr = inet_addr("233.233.233.233");
	db.imr_interface.s_addr = inet_addr("192.168.10.5");
	setsockopt(sockfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&db,sizeof(db));
	//4.接收数据
	char buf[30];
	int len = sizeof(zb);
	while(1)
	{
		bzero(buf,sizeof(buf));
		recvfrom(sockfd,buf,sizeof(buf),0,(struct sockaddr *)&zb,&len);
		printf("S:%s\n",buf);
	}
	return 0;
}

四、图解如下

 

 


 总结

关于C/C++网络编程基础知识超详细讲解第二部分的详解,懒大王就先分享到这里了,如果你认为这篇文章对你有帮助,请给懒大王点个赞点个关注吧,如果发现什么问题,欢迎评论区留言!!💕💕 💕 

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

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

相关文章

一个可以自动把微信聊天收到的二维码图片实时提取出来并分类的软件

10-1 如果你有需要实时地、自动地把微信各个群收到的二维码图片提取出来的需求&#xff0c;那本文章适合你&#xff0c;本文章的主要内容是教你如何实现自动提取微信收到的二维码图片&#xff0c;助你快速扫码&#xff0c;永远比别人领先一步。 首先需要准备好的材料&#xf…

51单片机汇编-点亮一个led

文章目录 前言1.打开IDE2.设置编辑器3.设置输出4. 原理图5.编写代码6 编译7.下载8.其它代码1.LED闪烁2.跑马灯 前言 51单片机基础 本章主要介绍打开一个led,具体采用51汇编 1.打开IDE 选择STC89C52RC 后缀是.asm 2.设置编辑器 3.设置输出 4. 原理图 5.编写代码 ORG 00H;伪代…

leetcode刷题日记:69.sqrt(x)

给出一个非负的整数x&#xff0c;返回x的平方根向下取整的结果&#xff0c;这个被返回的数也应该是一个非负的值。 对我们的要求是不能使用任何内置的指数函数与操作&#xff0c;官方还给了我们例子&#xff1a; 在C种不能使用pow(x, 0.5) 在python不能使用 x**0.5 既然官方已经…

【漏洞复现】weblogic-SSRF漏洞

感谢互联网提供分享知识与智慧&#xff0c;在法治的社会里&#xff0c;请遵守有关法律法规 文章目录 漏洞测试注入HTTP头&#xff0c;利用Redis反弹shell 问题解决 Path : vulhub/weblogic/ssrf 编译及启动测试环境 docker compose up -dWeblogic中存在一个SSRF漏洞&#xff0…

嵌入式系统中的FPGA

举个栗子 假设你有一台智能家居系统&#xff0c;其中的FPGA可以被类比为智能家居中的中央控制器。 智能家居系统&#xff1a; 定制家居逻辑&#xff1a; 你希望智能家居系统能够根据你的生活习惯、时间表和喜好自动控制灯光、温度、窗帘等设备。就像FPGA中可以根据需求重新配置…

Java面向对象(进阶)-- super关键字的使用与子类对象实例化全过程

文章目录 一、super关键字的使用&#xff08;1&#xff09;为什么需要super&#xff1f;&#xff08;2&#xff09;super的理解&#xff08;3&#xff09;super可以调用的结构1、super调用方法举例1举例2举例3小结 2、super调用属性举例1举例2举例3小结 3、super调用构造器引入…

解决gtihub访问不到的

解决gtihub访问不到的 小编一开始也是找不到git但是通过查询资料&#xff0c;最终也是找到了解决方式 据说git的ip地址通常会变化的&#xff0c;可以通过地址查询网站查询到git当前的ip https://sites.ipaddress.com/github.com/在输入框中github.com&#xff0c;然后搜索 在…

【大数据】常见的数据抽取方法

常见的数据抽取方法 1.基于查询式的数据抽取1.1 触发器方式&#xff08;又称快照式&#xff09;1.2 增量字段方式1.3 时间戳方式1.4 全表删除插入方式 2.基于日志的数据抽取 数据抽取 是指从源数据源系统抽取需要的数据。实际应用中&#xff0c;数据源较多采用的是关系数据库。…

【计算机网络笔记】传输层——拥塞控制原理与解决方法

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…

爬虫项目-爬取股吧(东方财富)评论

1.最近帮别人爬取了东方财富股吧的帖子和评论&#xff0c;网址如下&#xff1a;http://mguba.eastmoney.com/mguba/list/zssh000300 2.爬取字段如下所示&#xff1a; 3.爬虫的大致思路如下&#xff1a;客户要求爬取评论数大于5的帖子&#xff0c;首先获取帖子链接&#xff0c…

淘宝预定商品收不到尾款通知 - 解决方案

问题 用户在使用淘宝购买预定商品后&#xff0c;待补尾款时&#xff0c;无法收到尾款通知&#xff0c;从而导致错过补齐尾款无法购买预定商品&#xff0c;下文介绍解决方案。 解决方案 进入淘宝后&#xff0c;购买预定商品时&#xff0c;在提交订单页面时&#xff0c;取消勾…

雨水收集设施模块收集和利用雨水成为解决城市供水矛盾的途径之一

雨水收集设施模块是一种高效、环保的雨水收集和利用系统&#xff0c;它通过收集和利用雨水来解决城市供水矛盾。 雨水收集设施模块主要由雨水收集器、储水池、过滤器和水泵等组成。当雨水流入雨水收集器时&#xff0c;经过过滤器的过滤&#xff0c;进入储水池中储存。当需要用…

算法模板之单调栈解密 | 图文详解

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;算法模板、数据结构 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. ⛳️单调栈讲解1.1 &#x1f514;单调栈的定义1.2 &#x1f514;如何维护一个单…

【错误解决方案】ModuleNotFoundError: No module named ‘selenium‘

1. 错误提示 ModuleNotFoundError: No module named selenium&#xff0c;这意味着你试图导入一个名为 selenium 的模块&#xff0c;但Python找不到这个模块 2. 解决方案 安装缺失的模块: 如果你确定模块名称正确但仍然收到这个错误&#xff0c;那么可能是你没有安装这个模块…

二维码智慧门牌管理系统升级:详细展示门牌信息,让你的生活更便捷

文章目录 前言一、旧问题的解决与升级特点二、满足信息平台要求 前言 随着科技的不断发展&#xff0c;我们的生活正日益智能化。其中&#xff0c;二维码智慧门牌管理系统成为了智能生活的一个重要组成部分。最近&#xff0c;这一系统经过新的升级&#xff0c;为我们的生活带来…

HTML5+CSS3实现小米商城(课程设计版)

前言 这个小米商城用到了htmlcssjs&#xff0c;内容是今年6月份的。 结构相对简单&#xff0c;比较容易理解。 如果想要纯htmlcss实现的小米商城&#xff0c;可以看我的这个作品 HTMLCSS实现小米商城 如果需要其他网页作品了&#xff0c;可以看主页其他作品。 HTMLCSS实现华为…

文档QA综述:关于多页文档,多模态,检索增强最新的进展

关于Document&#xff0c;Multimodal&#xff0c;RAG最新的进展 一&#xff1a;PDFTriage 一&#xff1a;PDFTriage 题目: PDFTriage: Question Answering over Long, Structured Documents 机构&#xff1a;斯坦福大学&#xff0c;Adobe Research 论文: https://arxiv.org/pd…

MAC苹果电脑系统清理垃圾软件CleanMyMac4.15

如今电脑成为大多数人工作的工具&#xff0c;使用得越久就越需要清理垃圾软件。系统垃圾、废纸娄垃圾、大型和旧文件这些通常都占用了我们的电脑几G的空间。 想要清除不必要的垃圾文件&#xff0c;可以使用mac卸载软件CleanMyMac X&#xff0c;这款清理垃圾软件可以智能扫描Ma…

探索Kosmos-2模型的神奇功能

Kosmos-2是一个多模态大语言模型&#xff0c;它可以理解和生成包含图像和文本的内容。它的特点是能够将文本中的指代表达式&#xff08;如“这个”、“那个”等&#xff09;与图像中的物体对应起来&#xff0c;实现局部理解和交互。如果你想使用Kosmos-2模型&#xff0c;你可以…

《人工智能算法图解》书籍推荐

书籍介绍 今天&#xff0c;人工智能在我们的生活中随处可见。它能推送我们喜欢的电视节目&#xff0c;帮助我们诊断疑难杂症&#xff0c;还能向我们推荐商品。因此&#xff0c;让我们掌握人工智能的核心算法&#xff0c;拥抱日新月异的智能世界吧。 与那些充斥着公式和术语的教…