Linux——网络编程总结性学习

news2025/4/5 4:30:39

什么是ISP?

网络业务提供商_百度百科

计算机网络有哪些分类方式,计算机网络有哪些分类?_陈泽杜的博客-CSDN博客

路由器_百度百科

 目前实际的网络分层是TCP/IP四层协议

当我们浏览⽹站找到想要下载的⽂件以后,找到相应的接⼝点击下载就好了。剩下的⼯作就交给⽹ 络了,那么⽹络是如果传输的呢?

        答案就是先封包然后再拆包。实际的远距离传输,可能会涉及多个⽹络,多个路由器。这⾥简化成 ⼀个来表示。我们看到,每⼀层都有相应的控制信息,需要加到数据前⾯,我们把这些控制信息称之为 包头。每层都有不同我包头,⽐如应⽤层可能就是FTP的包头,然后,传输层可能就是TCP包头,再往下 传输层: 应⽤层: 数据的封包与拆包 7 依次就是IP包,以太⽹ (Ethernet),到了物理层以后,上层交下来的数据,就会变成bit流,被放的实 际的物理设备上进⾏传输。

        如果⽬标在本⽹络内部,数据就会被直接发送的⽬标主机上⾯,作相反的操作,也就是拆包。⼀般 我们下载的⽂件基本上都存在于远程的服务器。所以,必然要经过多个⽹络,多个路由器。每个路由器 都按照如图所示的步骤,层层拆包,折到⽹络层的IP头以后,和⾃⼰的⼀个叫做路由表的东⻄进⾏⽐ 对,确定⼀个合适的⽹络地址,按照新的⽹络地址再次进⾏封装。下⼀个路由器⽣复这个动作,直到把 数据传送给⽬标主机为⽌。

        最后,再由⽬标主机,也就是你的电脑,进⾏拆包。然后把数据展示给你或者直接存储到磁盘上。

网络程序的架构

⽹络程序通常有两种架构,⼀种是

B/S(Browser/Server,浏览器/服务器)架构

⽐如我们使⽤⽕狐浏览器浏览Web⽹站,⽕狐浏览器就是⼀个Browser,⽹站上运⾏的Web就是⼀个服 务器。这种架构的优点是⽤户只需要在⾃⼰电脑上安装⼀个⽹⻚浏览器就可以了,主要⼯作逻辑都在服 务器上完成,减轻了⽤户端的升级和维护的⼯作量

另外⼀种架构是C/S(Client/Server,客户机/服务器)架构

这种架构要在服务器端和客户端分部安装不同的软件,并且不同的应⽤,客户端也要安装不同的客户机 软件,有时候客户端的软件安装或升级⽐较复杂,维护起来成本较⼤。但此种架构的优点是可以较充分 地利⽤两端的硬件能⼒,较为合理地分配任务。值得注意的是,客户机和服务器实际指两个不同的进 程,服务器是提供服务的进程,客户机是请求服务和接受服务的进程,它们通常位于不同的主机上(也 可以是同⼀主机上的两个进程),这些主机有⽹络连接,服务器端提供服务并对来⾃客户端进程的请求 做出响应。⽐如我们常⽤的QQ,我们⾃⼰电脑上的QQ程序就是⼀个客户端,⽽在腾讯公司内部还有服 务器端器程序。

基于套接字的⽹络编程中,通常使⽤C/S架构。⼀个简单的客户机和服务器之间的通信过程如下: 1. 客户机向服务器提出⼀个请求

2. 服务器收到客户机的请求,进⾏分析处理

3. 服务器将处理的结果返回给客户机 通常,⼀个服务器可以向多个客户机提供服务。因此对服务器来说,还需要考虑如何有效地处理多个客 户机的请求。 

 这里的ip是公网ip,局域网也一样,在一个局域网内IP也不能相同,他们经过一个路由统一封装成公网ip。

 网络桥接_百度百科

从前192.168是专用局域网段

 

 一般不使用的特殊ip

 

IP地址是分等级的地址结构,分两个等级的好处是

 (3) 地址掩码 ⼜称为⼦⽹掩码 (subnet mask)。

位数:32 位。

⽬的:让机器从 IP 地址迅速算出⽹络地址。

由⼀连串 1 和接着的⼀连串 0 组成,⽽ 1 的个数就是⽹络前缀的⻓度。

/20 地址块的地址掩码:11111111 11111111 11110000 00000000

点分⼗进制记法:255.255.240.0

CIDR 记法:255.255.240.0/20。

默认地址掩码

 

 IP地址在Linux当中的实现

 IP地址是⼀个32位的数据

通常被封装成如下数据类型

struct in_addr { uint32_t s_addr; };

in_addr_t

uint32_t

 

 

 常用的熟知端口

 

计算机电路先处理低位字节,效率比较高,因为计算都是从低位开始的。所以,计算机的内部处理都是小端字节序。但是,人类还是习惯读写大端字节序。所以,除了计算机的内部处理,其他的场合比如网络传输和文件储存,几乎都是用的大端字节序。正是因为这些原因才有了字节序。

计算机处理字节序的时候,如果是大端字节序,先读到的就是高位字节,后读到的就是低位字节。小端字节序则正好相反

#include <stdio.h>
typedef unsigned char byte;
typedef unsigned int word;

//#define N 1


int main(int argc, char *argv[])
{
	word val32 = 0x11223344;
	byte val8 = *( (byte*)&val32 );	

	if(val8 == 0x44)
		printf("本机是⼩端字节序\n");
	else
		printf("本机是⼤端字节序\n");
	int c = 1;
	//int *a = c;
	char b = *(char*)&c;
	printf("%p %d\n",&c ,b);


	return 0;
}

 

#include <stdio.h>
#include <arpa/inet.h>
typedef unsigned char byte;
typedef unsigned int word;
int main(int argc, char *argv[])
{
	word val32 = 0x11223344;
	byte val8 = *( (byte*)&val32 );
	if(val8 == 0x44)
	{
		printf("本机是⼩端字节序\n");
		val32 = htonl(val32);
		val8 = *( (byte*)&val32 );
		if(val8 == 0x44)
			printf("字节序没有转换\n");
		else
			printf("转换成功, 现在是⽹络字节序了\n");
	}
	return 0;
}

 IP地址的转换函数

 

来个小实验,使用本机的两个虚拟机根据ip和端口号通信

 

只能一对一谁手快和谁通信

 服务器是如何实现每台服务器都是公网IP的呢?

socket分类

 

 

 

流式套接字对应TCP数据报套接字对应UDP,所以protocol是0,只用用原始套接字时才需要有参数。

 套接字不知用于网络通信也可用于进程间通信,在网络通信中可选用IIPV4和IPV6

 

 

!g就是shell中上次输入的g开头的命令

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <arpa/inet.h>

int main(int argc, char **argv)
{
	int fd = socket(AF_INET, SOCK_STREAM, 0);
	if(fd < 0)
	{
		perror("socket");
		exit(0);
	}
	struct sockaddr_in addr;
	addr.sin_family = AF_INET;
	addr.sin_port = htons(8888);
	addr.sin_addr.s_addr = inet_addr("192.168.26.128");
	if(bind(fd, (struct sockaddr *)&addr, sizeof(addr)))//成功0/失败-1
	{
		perror("bind");
		exit(0);
	}
	struct sockaddr_in sin;
	socklen_t sinlen = sizeof(addr);
	if(getsockname(fd, (struct sockaddr *)&sin, &sinlen))
	{
		perror("getsockname");
		exit(0);
	}
	printf("文件描述符%d绑定地址是%s,端口号%d\n", fd, inet_ntoa(sin.sin_addr),ntohs(sin.sin_port));
	return 0;
}

 

 

 

 

 

 

 

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <unistd.h>
#define BACKLOG 5//可以有5个等待在队列中

int main(int argc, char **argv)
{
	int fd = socket(AF_INET, SOCK_STREAM, 0);
	if(fd < 0)
	{
		perror("socket");
		exit(0);
	}
	struct sockaddr_in addr;
	addr.sin_family = AF_INET;
	addr.sin_port = htons(8888);
	addr.sin_addr.s_addr = inet_addr("192.168.26.128");
	if(bind(fd, (struct sockaddr *)&addr, sizeof(addr)))//成功0/失败-1
	{
		perror("bind");
		exit(0);
	}
	struct sockaddr_in sin;
	socklen_t sinlen = sizeof(addr);
	if(getsockname(fd, (struct sockaddr *)&sin, &sinlen))
	{
		perror("getsockname");
		exit(0);
	}
	printf("文件描述符%d绑定地址是%s,端口号%d\n", fd, inet_ntoa(sin.sin_addr),ntohs(sin.sin_port));
	if(listen(fd, BACKLOG)){
		perror("listen");
		exit(0);
	}
	printf("listen...\n");
	struct sockaddr_in cin;
	socklen_t cinlen = sizeof(cin);
	int newfd = accept(fd, (struct sockaddr *)&cin, &cinlen);
	//int newfd = accept(fd, NULL, NULL);
	if(newfd < 0)
	{
		perror("accept");
		exit(0);
	}
	printf("文件描述符%d绑定IP地址%s,端口号%d\n", newfd, inet_ntoa(cin.sin_addr), ntohs(cin.sin_port));
	char buf[1024] = {};
	read(newfd, buf, 1024);
	printf("%s\n", buf);
	
	close(newfd);
	close(fd);

	return 0;
}

 还是用nc这次可以看连接服务器用户的相关信息

 

 

 

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
int main(int argc, char *argv[])
{
	if(argc != 3)
	{
		printf("%s [IP][PORT]\n", argv[0]);
		exit(0);
	}
/*1.创建套接字*/
	int fd = socket(AF_INET, SOCK_STREAM, 0);
	if(fd < 0)
	{
		perror("socket");
		exit(0);
	}
/*2.设置通信结构体*/
	struct sockaddr_in sin;
	sin.sin_family = AF_INET;
	sin.sin_port = htons(atoi(argv[2]));
	sin.sin_addr.s_addr = inet_addr(argv[1]);
/*3.向服务端发起连接请求*/
	if(connect(fd, (struct sockaddr *)&sin, sizeof(sin)))
	{
		perror("connect");
		exit(0);	
	}
	socklen_t sinlen = sizeof(sin);
	if(getsockname(fd, (struct sockaddr *)&sin, &sinlen))
	{
		perror("getsockname");
		exit(0);
	}
	printf("文件描述符%d绑定IP地址%s,端口号%d\n", fd, inet_ntoa(sin.sin_addr), ntohs(sin.sin_port));
/*4.通信*/
	char buf[1024] = {"test\n"}; //8142	
	write(fd, buf, strlen(buf)+1);
	memset(buf, 0, 1024);
	//printf("input->");
	//fgets(buf, , stdin);
	//write(fd, buf, strlen(buf)+1);
	read(fd, buf, 1024);
	printf("buf = %s\n", buf);
	close(fd);
	return 0;
}
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <unistd.h>
#define BACKLOG 5//可以有5个等待在队列中

int main(int argc, char *argv[])
{
	if(argc != 3)
	{
		fprintf(stderr, "%s [IP] [PORT] \n", argv[0]);
		exit(0);
	}
	int fd = socket(AF_INET, SOCK_STREAM, 0);
	if(fd < 0)
	{
		perror("socket");
		exit(0);
	}
	struct sockaddr_in addr;
	addr.sin_family = AF_INET;
	addr.sin_port = htons(atoi(argv[2]));
	addr.sin_addr.s_addr = inet_addr(argv[1]);
	if(bind(fd, (struct sockaddr *)&addr, sizeof(addr)))//成功0/失败-1
	{
		perror("bind");
		exit(0);
	}
	struct sockaddr_in sin;
	socklen_t sinlen = sizeof(addr);
	if(getsockname(fd, (struct sockaddr *)&sin, &sinlen))
	{
		perror("getsockname");
		exit(0);
	}
	printf("文件描述符%d绑定地址是%s,端口号%d\n", fd, inet_ntoa(sin.sin_addr),ntohs(sin.sin_port));
	if(listen(fd, BACKLOG)){
		perror("listen");
		exit(0);
	}
	printf("listen...\n");
	struct sockaddr_in cin;
	socklen_t cinlen = sizeof(cin);
	int newfd = accept(fd, (struct sockaddr *)&cin, &cinlen);
	//int newfd = accept(fd, NULL, NULL);
	if(newfd < 0)
	{
		perror("accept");
		exit(0);
	}
	printf("文件描述符%d绑定IP地址%s,端口号%d\n", newfd, inet_ntoa(cin.sin_addr), ntohs(cin.sin_port));
	char buf[1024] = {};
	read(newfd, buf, 1024);
	printf("%s\n", buf);
	
	close(newfd);
	close(fd);

	return 0;
}


 

 

 哈哈天天ping百度百度不爱搭理了,ping一下华清试试 

socket有两个缓冲区一个发送一个接收

 

 

#include "net.h"
int main(int argc, char *argv[])
{
if(argc != 3)
{
printf("%s [IP][PORT]\n", argv[0]);
exit(0);
}
/*1.创建套接字*/
int fd = socket(AF_INET, SOCK_DGRAM, 0);
if(fd < 0)
{
perror("socket");
exit(0);
}
/*2.设置通信结构体*/
struct sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(atoi(argv[2]));
sin.sin_addr.s_addr = inet_addr(argv[1]);
/*3.向服务端发起连接请求*/
if(connect(fd, (struct sockaddr *)&sin, sizeof(sin)))
{
perror("connect");
exit(0);
}
/*4.通信*/
char buf[BUFSIZ];
while(1)
{
bzero(buf, BUFSIZ);
printf("input->");
fgets(buf, BUFSIZ, stdin);
send(fd, buf, strlen(buf)+1, 0);
printf("buf = %s\n", buf);
if(buf[0] == '#')
break;
}
close(fd);
return 0;
}

 

 

 

相关程序参考Linux——UDP_宇努力学习的博客-CSDN博客 

先win+R wt 然后telnet 

win上没有nc可以用telnet

 

 

 看以往文章

这里记录一个老师写的大型群体交流服务器

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include <wait.h>

#define BACKLOG 5

void handle(int sig)
{
	printf("child process exit...\n");
	wait(NULL);
}

int main(int argc, char *argv[])
{
	if(argc != 3)
	{
		printf("%s[IP][PORT]\n", argv[0]);
		exit(0);
	}

	signal(SIGCHLD, handle);

	int fd = socket(AF_INET, SOCK_STREAM, 0);
	if(fd < 0)
	{
		perror("socket");
		exit(0);
	}

	struct sockaddr_in addr;
	addr.sin_family = AF_INET;
	addr.sin_port = htons(atoi(argv[2]));
	addr.sin_addr.s_addr = inet_addr(argv[1]);

	if( bind(fd, (struct sockaddr *)&addr, sizeof(addr)) )
	{
		perror("bind");
		exit(0);
	}

	struct sockaddr_in sin;
	socklen_t sinlen = sizeof(addr);
	if(getsockname(fd, (struct sockaddr *)&sin, &sinlen))
	{
		perror("getsockname");
		exit(0);
	}
	printf("文件描述符%d绑定的IP地址是%s,端口号%d\n", fd, inet_ntoa(sin.sin_addr), ntohs(sin.sin_port));

	if( listen(fd, BACKLOG) )
	{
		perror("listen");
		exit(0);
	}

	printf("listen...\n");

	pid_t pid;
	int newfd;
	char buf[1024] = {};
	struct sockaddr_in cin;
	socklen_t cinlen = sizeof(cin);

	while(1)
	{
		newfd = accept(fd, (struct sockaddr *)&cin, &cinlen);
		if(newfd < 0)
		{
			perror("accept");
			exit(0);
		}
		printf("文件描述符%d绑定的IP地址是%s,端口号%d\n", newfd, inet_ntoa(cin.sin_addr), ntohs(cin.sin_port));
		pid = fork();
		if(pid < 0)
		{
			perror("fork");
			exit(0);
		}
		else if(!pid)
		{
			close(fd);
			while(1)
			{
				memset(buf, 0, 1024);
				if(!read(newfd, buf, 1024))
					break;
				printf("%s\n", buf);
			}
			close(newfd);
			exit(0);
		}
		else
			close(newfd);
	}
	close(fd);
	return 0;
}

select实现服务器

#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <sys/select.h>
#include <arpa/inet.h>
#include <strings.h>
#include <unistd.h>

typedef struct sockaddr Addr;
typedef struct sockaddr_in Addr_in;
typedef struct Node{
	int fd;
	struct Node *next;
}Node;

#define BACKLOG 5

void Argment(int argc, char *argv[]);
void NodeCreate(Node **p);
void AcceptHandle(int sfd, Node **H);
int ClientHandle(int fd);

int main(int argc, char *argv[])
{
	int ret, sfd, nfd = 0;
	Addr_in saddr;
	fd_set rfds;
	Node *H, *p = NULL;

	Argment(argc, argv);

	NodeCreate(&H);

	sfd = socket(AF_INET, SOCK_STREAM, 0);
	if(sfd < 0)
	{
		perror("socket");
		exit(0);
	}

	saddr.sin_family = AF_INET;
	saddr.sin_port = htons(atoi(argv[2]));
	saddr.sin_addr.s_addr = inet_addr(argv[1]);

	if(bind(sfd, (Addr *)&saddr, sizeof(Addr_in)))
	{
		perror("bind");
		exit(0);
	}

	if(listen(sfd, BACKLOG))
	{
		perror("listen");
		exit(0);
	}

	H->fd =sfd;
	while(1)
	{
		FD_ZERO(&rfds);
		p = H;
		nfd = 0;
		while(p != NULL)
		{
			if(p->fd > nfd)
				nfd = p->fd;
			FD_SET(p->fd, &rfds);
			p = p->next;
		}
		printf("nfd = %d run select...\n", nfd);
		ret =select(nfd+1, &rfds, NULL, NULL, NULL);
		if(!ret)
			continue;
		if(ret < 0)
		{
			perror("select");
			exit(0);
		}
		p = H;
		while(p->next != NULL)
		{
			if(FD_ISSET(p->fd, &rfds))
			{
				if(ClientHandle(p->fd) <= 0)
				{
					close(p->fd);
					Node *q = p->next;
					p->fd = q->fd;
					p->next = q->next;
					free(q);
					continue;
				}
			}
			p = p->next;
		}
		if(FD_ISSET(p->fd, &rfds))
			AcceptHandle(p->fd, &H);
#if 1
		p = H;
		puts("");
		printf("Node:");
		while(p != NULL)
		{
			printf("%d ", p->fd);
			p = p->next;
		}
#endif
		if(H->next == NULL)
			break;
	}
	close(sfd);
	free(H);
	return 0;
}

void Argment(int argc, char *argv[])
{
	if(argc != 3)
	{
		fprintf(stderr, "%s [addr] [port]\n", argv[0]);
		exit(0);
	}
}

void NodeCreate(Node **p)
{
	*p = malloc(sizeof(Node));
	if(p == NULL)
	{
		perror("malloc");
		exit(0);
	}
	bzero(*p, sizeof(Node));
}

void AcceptHandle(int sfd, Node **H)
{
	Node *p = NULL;
	Addr_in caddr;
	socklen_t caddr_len = sizeof(Addr_in);
	int cfd = accept(sfd, (Addr *)&caddr, &caddr_len);
	if(cfd < 0)
	{
		perror("accept");
		exit(0);
	}
	fprintf(stderr, "client %s:%d connect success.\n",
			inet_ntoa(caddr.sin_addr), ntohs(caddr.sin_port));
	NodeCreate(&p);
	p->fd = cfd;
	p->next = *H;
	*H = p;
}

int ClientHandle(int fd)
{
	int ret;
	char buf[1024] = {};
	ret = recv(fd, buf, 1024, 0);
	if(ret <= 0)
		return 0;
	printf("fd=%d buf = %s\n",fd, buf);
	if(buf[0] == '#')
		return 0;
	return ret;
}

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

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

相关文章

新形势下安全风险评估实践

​ 随着安全内涵的不断扩充和发展&#xff0c;风险评估作为安全管理的重点&#xff0c;内容以及方法都与时俱进的得到了发展和丰富&#xff0c;本文将介绍新形势下风险评估的特点和实践心得&#xff0c;以供参考。 一、新形势下安全风险评估特点 首先是内外部形势和要求的变…

Docker入门教程(详细)

目录 一、Docker概述 1.1 Docker 为什么出现&#xff1f; 1.2 Dorker历史 1.3 能做什么 虚拟机技术&#xff1a;&#xff08;通过 软件 模拟的具有完整 硬件 系统功能的、运行在一个完全 隔离 环境中的完整 计算机系统&#xff09; 容器化技术&#xff1a;&#xff08;容…

【JAVA高级】——玩转JDBC中的三层架构

✅作者简介&#xff1a;热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏&#xff1a;Java案例分…

Oracle SQL执行计划操作(8)——视图与集合相关操作

8. 视图相关操作 该类操作与包含视图的SQL语句相关。当SQL语句被硬解析时,如果SQL语句中的视图未被合并,则根据不同的具体场景,如下各操作可能会出现于相关SQL语句的执行计划。 1)VIEW 创建数据的一个中间视图,一般分为系统视图和用户视图。优化器在为SQL语句生成执行计…

iOS上架流程详细版本

苹果上架审核周期长一直是困扰用户的一大问题&#xff0c;这次把我自己上架的经历分享给大家&#xff0c;避免大家入坑。 上架总流程&#xff1a; 创建开发者账号 借助辅助工具appuploader创建证书&#xff0c;描述文件 iTunes connect创建App 打包IPA上传App Store等待审…

Kubernetes(k8s)CNI(flannel)网络模型原理

一、概述 Kubernetes 采用的是基于扁平地址空间的、非NAT的网络模型&#xff0c;每个Pod有自己唯一的IP地址。网络是由CNI(container network interface)插件建立的&#xff0c;而非K8S本身。 二、常见的几种CNI插件介绍 为了使容器之间的通信更加方便&#xff0c;Google 和 Co…

计算机网络面试大总结

本文分文五大部分&#xff0c;第一部分总纲说明计算机网络层次划分的三种模型&#xff0c;一到四部分以TCP/IP协议模型作为划分标准&#xff0c;分别说明各层作用和最常见的面试题&#xff0c;最后总结网络综合面试题&#xff0c;历时六天全文一千字。 其他经典面试题参考程序员…

虹科校园大使招募令

虹科校园大使招募令 我们正式邀请你成为虹科校内明星代言人&#xff01; 近距离接触技术大牛工作领域 来自人力总监的职业发展指导 官方校园大使认证证书 走内部通道提前斩获校招offer 你将成为 校园品牌首席推广师 赋予你自主“DIY”的权利&#xff0c;与校招负责人一起…

损失函数——机器学习

目录 一、实验内容 二、实验过程 1、算法思想 2、算法原理 3、算法分析 三、源程序代码 四、运行结果分析 五、实验总结 一、实验内容 理解损失函数的基本概念&#xff1b;理解并掌握均方差损失函数的原理&#xff0c;算法实现及代码测试分析&#xff1b;理解并掌握交叉…

【linux】linux实操篇之权限管理

14天学习训练营导师课程&#xff1a; 互联网老辛《 符合学习规律的超详细linux实战快速入门》 目录前言权限的基本介绍rwx权限详解更改文件属性1、chgrp&#xff1a;更改文件属组2、chown&#xff1a;更改文件属主&#xff0c;也可以同时更改文件属组3、chmod&#xff1a;更改文…

帷幄前沿茶话丨如何发起一场直播间运营变革?

打开抖音&#xff0c;各种各样的带货模式都有。吃播的、喊麦的、跳舞的、说相声的&#xff0c;各种表现形式都可以是带货的手段。 但实际效果如何复盘&#xff1f;一旦感性的带货模式回归到理性分析&#xff0c;问题就没那么简单了。 电商的关键衡量指标是 GMV。直播带货中&…

[附源码]java毕业设计学院竞赛管理信息系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

RabbitMQ【基本使用】

目录 消息队列 1. Message queue 释义 1.1 问题思考 ? 1.2 存在问题 1.3 优化方案 1.4 案例分析 1.5 带来的好处 1.6 消息队列特点 1.7 Email邮件案例分析 2. 消息队列相关 2.1 AMQP 3. Docker安装部署RabbitMQ 4. springboot连接配置 4.1 RabbitMQ 配置账号…

Unity记录

第四课&#xff1a;组件 自定义组件&#xff0c;主要是 编写 脚本 脚本&#xff1a;要求必须 挂载 到游戏物体上&#xff0c;才能使用 主要组件&#xff1a; &#xff08;1&#xff09;gameObject 游戏对象 VS中的显示 总结&#xff1a; //属性 name:名称 tag : 标签名称 ac…

Execution failed for task ‘:app:javaPreCompileDebug‘.

debug运行app到模拟器的时候&#xff0c;一直报错&#xff0c;然后百度了下&#xff0c;给出的答案是&#xff1a; android { defaultConfig { //添加如下配置就OK了 javaCompileOptions { annotationProcessorOptions { includeCompileClasspath true } } } 但是加了之后&am…

[附源码]java毕业设计养老护理综合服务系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

个人养老金真的要来了,详解人社部、财政部、税务局、银保监会和证监会联合发布的《个人养老金实施办法》(要点概览+示意图+逐条解读)

11月5日&#xff0c;人力资源社会保障部、财政部、国家税务总局、银保监会、证监会联合发布了《个人养老金实施办法》。&#xff08;人社部发〔2022〕70号&#xff09; 11月18日&#xff0c;中国银保监会发布了《商业银行和理财公司个人养老金业务管理暂行办法》。&#xff08;…

将一个硬盘空间分配给另一个硬盘,怎么把一个磁盘的空间给另一个磁盘

用户在管理电脑磁盘分区的时候&#xff0c;为了更好地利用磁盘分区&#xff0c;需要对磁盘分区进行调整&#xff0c;如果涉及到磁盘分区调整&#xff0c;将一个硬盘空间分配给另一个硬盘&#xff1f;那么&#xff0c;在本文中&#xff0c;易我小编将介绍电脑磁盘分区调整的知识…

【Linux】线程池

文章目录1.线程池概念2.线程池的优点3.线程池的应用场景4.线程池的实现5.STL和智能指针和线程安全5.1其他常见锁5.2读写锁1.线程池概念 线程池是一种线程使用模式。 线程过多会带来调度开销&#xff0c;进而影响缓存局部性和整体性能。而线程池维护着多个线 程&#xff0c;等待…

土地覆盖数据集汇总

前言 土地覆盖数据是理解人类活动与全球变化之间复杂相互作用的关键信息来源,在改善生态系统、水文和大气模型的性能方面发挥着关键作用。而土地覆盖变化(LCC)是全球环境变化的起因和结果&#xff0c;影响着全球能量平衡和生物地球化学循环&#xff0c;进而影响气候变化和生态系…