Linux 网络编程

引入:


进程间的通信 - 特点: 依赖 Linux内核. --> 缺陷: 无法多机通信

多机通信 -- 比如 Android IOS Linux之间的通信组合

网络编程:

1.地址: 
  a.IP地址
  b.端口号

2.数据:

需要协议传输协议(数据格式)(TCP UDP HTTP) ,其他协议,such as: C51的串口协议

socket 套接字:


TCP: 面向连接: 打电话 -- 适用精细操作

UDP:    面向报文: (无连接)发数据 -- 适用大量数据,且不要求精细

TCP 和 UDP 对比 :


1.TCP面向连接(比如,打电话,需要先输入号码建立连接)
   UDP无需连接
2.TCP提供可靠服务 -- 通过TCP传输的数据,无差错,不丢失,不重复,且程序可达
   UDP尽最大可能交付,但不保证交付
3.TCP面向字节流,实际上是TCP把数据看成一串无结果的字节流
   UDP面向报文,UDP没有拥塞控制,so网络出现拥塞不会使得元主机发送速率降低(对实时应用很有用,IP电话,实时视频会议等)
4.连接上: TCP: 一对一,点到点
               UDP:一对一,一对多,多对一,多对多的交互通信
5.TCP首部开销大,   20字节
   UDP首部开销小,  8字节
6.逻辑通信信道上,TCP: 双全工   
                               UDP:不可靠信道

端口号的作用:


拥有IP的主机会提供一系列的服务,通过" IP地址+ 端口号"来区分不同的服务
端口提供了一种访问通道

服务器一般都是通过知名的端口号来识别。
比如: FTP服务器-TCP21  Telnet-TCP23  TFTP-UDP69
=====================================================


字节序

概念:
字节序 -- 多字节数据在 计算机内存中存储 或者 网络传输时 各字节的存储顺序

常见序:
小端字节序-LE:低序字节存储在起始地址
大端字节序-BE:  高序字节存储在起始地址
 
比如:  0x 01 02 03 04
内存地址从低字节算起, 就是从04 算起,04 - 4001 03-4002 02-4003 01-4004

LE(Little Endian) : 04 03 02 01
BE(Big Endian):   01 02 03 04

网络字节序 -- 大端字节序

Scoket 网络编程步骤:


TCP Server
服务器开发步骤:
socket() --> bind() --> listen() --> accept()  --> read() write() --> close()
1. 创建套接字 --socket
2.为套接字添加信息(IP 和 端口号) - bind
3. 监听网络连接   -->listen()
4.有客户端接入接受一个链接 - accept
5.数据交互 - read() write()
6.关闭套接字,断开连接 close()

TCP Client:

scoket() --> connect() --> write(),read() --> close()


====================================================


Linux 网络编程 API

服务器


1.创建套接字socket: 

头文件
       #include <sys/types.h>          /* See NOTES */
       #include <sys/socket.h>

函数原型

       int socket(int domain, int type, int protocol);

参数介绍: 


domain - 协议族:  AF_INET IPv4,  af_INET6  IPv6  - 因特网域  AF_UNIX -Unix域、

type-- 指定类型: 
 SOCK_STREAM  -- TCP-- 字节流的形式
 SOCK_DGRAM -- UDP -- 报文的形式

protocol  --协议: 
0 -- 选择 type指定类型的吗,默认协议
IPPROTO_TCP
IPPROTO_UDP

IPPROTO_SCTP
IPPROTO_TIPC


2.准备地址(IP + 端口号) bind:

头文件

      #include <sys/types.h>          /* See NOTES */
       #include <sys/socket.h>

函数原型

       int bind(int sockfd, const struct sockaddr *addr,
                socklen_t addrlen);

参数:
sockfd -- socket 描述符
addr -- 结构体指针-- 结构体里面包含了需要的 IP  和 端口号 协议族
addrlen -- 结构体的大小

addr 的 结构体原型:

struct sockaddr_in{
sa_family_t sin_family; //地址族(Address Family),也就是地址类型
uint16_t sin_port; //16位的端口号
struct in_addr sin_addr; //32位IP地址
char sin_zero[8]; //不使用,一般用0填充
};

------------------------


地址 转换API:
 

头文件

      #include <sys/socket.h>
       #include <netinet/in.h>
       #include <arpa/inet.h>

函数原型

       int inet_aton(const char *cp, struct in_addr *inp);
     //将字符串形式的ip地址(102.168.88.5)转换为网络能识别的格式

    //  a -- ASCLL     to -- 就是to转换为的意思  n -- net  网络形式
 
         char *inet_ntoa(struct in_addr in);
    // 把网络格式的ip地址转为字符串形式的ip地址

3.监听:listen 

函数原型:
               int listen(int sockfd, int backlog);

参数:
 sockfd -- socket描述符
 backlog -- 最大连接数


4.连接accept:

函数原型
   int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

参数:
 sockfd -- socket描述符
 addr --- 客户端地址
 addrlen); --  客户端地址长度


5. 数据收发:

用到API
      read() write()   send() recv()


客户端连接主机:

注:由于客户端的其他方面步骤使用的API 和服务器都一样,我们在这就不重复了,请看上面服务器API的部分去了解,我们这里只介绍客户端独有的  connect()

connect()
 

函数原型

       int connect(int sockfd, const struct sockaddr *addr,
                   socklen_t addrlen);

参数:
*addr -- 服务器ip和端口号的指针
addrlen -- 什么的纠结体的大小
-------------------------------------------------------

 查看库的指令补充
 在 /usr/include/ 下去查找文件的时候
可使用 grep "test" * -nir  
-n 找到返回行号
-i 不区分大小写
-r递归寻找


//低于3000 的端口是操作系统使用,我们使用5000即可
我们Linux固定的ip:192.168.88.130(根据自己的ip地址修改)

怎么查看自己的ip地址  -- linux 指令  ifconfig




实例


case1: 实现基本的服务器:


#include<stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
//#include<linux/in.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include<stdlib.h>

int main()
{
    int s_fd; // 来接收套接字描述符
//1. socket -- IPv4  流形式i 0 --默认 TCP 
s_fd=socket(AF_INET,SOCK_STREAM,0);
if(s_fd == -1){ // 返回值为-1 表示创建失败
    perror("socket");
    exit(-1);
}
// 初始化bind需要的struct
struct sockaddr_in s_addr;
s_addr.sin_family=AF_INET; // 指定协议族为IPV4
// htons -- h - host to  ns-net short
s_addr.sin_port=htons(8989);// 指定端口号
// a -- ASCLL 
inet_aton("192.168.88.130",&s_addr.sin_addr); // 指定ip地址,注意第二个参数格式,把ip地址放到第二个参数 sin_arr里面

//3.bind
bind(s_fd,(struct sockaddr *)&s_addr,sizeof(struct sockaddr_in ));// bind - 建立连接 准备
// listen
listen(s_fd,10); // listen 阻塞程序,等待连接  指定最大链接数为10
//4.accept
int c_fd=accept(s_fd,NULL,NULL); // 获得新的客户端 描述符

puts("connect.");
while(1);

    return 0;
}

============================================


case2 -- read write 实现读取输入信息

#include<stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
//#include<linux/in.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include<stdlib.h>
#include<string.h>
#include <unistd.h>


int main()
{
    int s_fd;
    struct sockaddr_in s_addr;
    struct sockaddr_in c_addr; // 创建两个结构体,自发自收

    int nread;
    char *msg="I get your connect";
    char readBuf[128];
    memset(&s_addr,0,sizeof(struct sockaddr_in));
    memset(&c_addr,0,sizeof(struct sockaddr_in));
int clen=sizeof(struct sockaddr_in);
//1. socket -- IPv4  流形式i 0 --默认 TCP 
s_fd=socket(AF_INET,SOCK_STREAM,0);
if(s_fd == -1){
    perror("socket");
    exit(-1);
}
// 初始化bind需要的struct

s_addr.sin_family=AF_INET;
// htons -- h - host to  ns-net short
s_addr.sin_port=htons(8988);
// a -- ASCLL 
inet_aton("192.168.88.130",&s_addr.sin_addr);

//3.bind
bind(s_fd,(struct sockaddr *)&s_addr,sizeof(struct sockaddr_in ));
// listen
listen(s_fd,10);
//4.accept  s_addr 发到 c_addr 里面
int c_fd=accept(s_fd,(struct sockaddr *)&c_addr,&clen); // 获得新的客户端 描述符
if(c_fd == -1){
perror("accept");
}

printf("get connect. %s\n",inet_ntoa(c_addr.sin_addr));

//read()
nread=read(c_fd,readBuf,128);
if(nread ==-1){
perror("read");
}
else {
printf("get message : %d ,%s\n",nread,readBuf);
}

// write
write(c_fd,msg,strlen(msg));

    return 0;
}
 

=============================


case3 : 编写代码实现客户端:

#include<stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
//#include<linux/in.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include<stdlib.h>
#include<string.h>
#include <unistd.h>


int main()
{
    int c_fd;
    struct sockaddr_in c_addr;
    int nread;
    char *msg="messeage from client";
    char readBuf[128];

    memset(&c_addr,0,sizeof(struct sockaddr_in));
int clen=sizeof(struct sockaddr_in);
//1. socket -- IPv4  流形式i 0 --默认 TCP 
c_fd=socket(AF_INET,SOCK_STREAM,0);
if(c_fd == -1){
    perror("socket");
    exit(-1);
}
// 初始化connect连接需要的struct

c_addr.sin_family=AF_INET;
// htons -- h - host to  ns-net short
c_addr.sin_port=htons(8988);
// a -- ASCLL 
inet_aton("192.168.88.130",&c_addr.sin_addr);

//2.connect -- 阻塞等待连接
int p_c=connect(c_fd,(struct sockaddr *)&c_addr,sizeof( struct sockaddr_in));
if(p_c==-1){
perror("connect");
exit(-1);
}

if(c_fd == -1){
perror("accept");
}

printf("get connect. %s\n",inet_ntoa(c_addr.sin_addr));

// write -- send 
write(c_fd,msg,strlen(msg));

//read()
nread=read(c_fd,readBuf,128);
if(nread ==-1){
perror("read");
}
else {
printf("get message from server: %d ,%s\n",nread,readBuf);
}

    return 0;
}

===================================

case4: 双人聊天室

服务器

#include <stdio.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
// #include<linux/in.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int main(int argc, char **argv)
{
    int s_fd;
    int c_fd;
    struct sockaddr_in s_addr;
    struct sockaddr_in c_addr;
    int nread;
    char msg[128]={0};
    char readBuf[128]={0};
    if(argc != 3){// 判断传参是否正确
    puts("Improper parameters");
    exit(-1);
    }
    memset(&s_addr, 0, sizeof(struct sockaddr_in));
    memset(&c_addr, 0, sizeof(struct sockaddr_in));
    int clen = sizeof(struct sockaddr_in);
    // 1. socket -- IPv4  流形式i 0 --默认 TCP
    s_fd = socket(AF_INET, SOCK_STREAM, 0);
    if (s_fd == -1)
    {
        perror("socket");
        exit(-1);
    }
    // 初始化bind需要的struct

    s_addr.sin_family = AF_INET;
    // htons -- h - host to  ns-net short
    s_addr.sin_port = htons(atoi(argv[2])); // 通过传参指定端口
    // a -- ASCLL  传参方式得到IP
    inet_aton(argv[1], &s_addr.sin_addr);

    // 3.bind
    bind(s_fd, (struct sockaddr *)&s_addr, sizeof(struct sockaddr_in));
    // listen
    listen(s_fd, 10);
    // 4.accept
    while (1)//保持一直接收,支持多个客户端的接入
    {
        c_fd = accept(s_fd, (struct sockaddr *)&c_addr, &clen); // 获得新的客户端 描述符
        if (c_fd == -1)
        {
            perror("accept");
        }

        printf("get connect. %s\n", inet_ntoa(c_addr.sin_addr));

        if (fork() == 0)
        { //  创建子进程来处理读写

            if (fork() == 0)
            {             // 创建一个子进程负责发送数据
                while (1) // 我们希望能一直接发
                {
                    memset(msg, 0, sizeof(msg));
                    printf("input:");
                    gets(msg); // //获取键盘数据,存入msg
                    write(c_fd, msg, strlen(msg));
                }
            }
            while (1)
            {
                // read()
                memset(readBuf,0,sizeof(readBuf));
                nread = read(c_fd, readBuf, 128);
                if (nread == -1)
                {
                    perror("read");
                }
                else
                {
                    printf("get message : %d ,%s\n", nread, readBuf);
                }
            }
        }
    }
    return 0;
}


客户端
#include <stdio.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
// #include<linux/in.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int main(int argc, char **argv)
{
    int c_fd;
    struct sockaddr_in c_addr;
    int nread;
    if(argc != 3){// 判断传参是否正确
    puts("Improper parameters");
    exit(-1);
    }
    char msg[128] = {0};
    char readBuf[128];

    memset(&c_addr, 0, sizeof(struct sockaddr_in));
    int clen = sizeof(struct sockaddr_in);
    // 1. socket -- IPv4  流形式i 0 --默认 TCP
    c_fd = socket(AF_INET, SOCK_STREAM, 0);
    if (c_fd == -1)
    {
        perror("socket");
        exit(-1);
    }
    // 初始化connect 需要的struct

    c_addr.sin_family = AF_INET;
    // htons -- h - host to  ns-net short
    c_addr.sin_port = htons(atoi(argv[2]));
    // a -- ASCLL
    inet_aton(argv[1], &c_addr.sin_addr);

    // 2.connect -- 阻塞等待连接
    int p_c = connect(c_fd, (struct sockaddr *)&c_addr, sizeof(struct sockaddr_in));
    if (p_c == -1)
    {
        perror("connect");
        exit(-1);
    }

    if (c_fd == -1)
    {
        perror("accept");
    }

    printf("get connect. %s\n", inet_ntoa(c_addr.sin_addr));

    while (1)
    { // 我们希望能一直读写 -- 实现聊天功能
        // write -- send
        if (fork() == 0)
        { // 创建一个子进程负责发送数据
            while (1) //我们希望能一直接发
            {
                memset(msg, 0, sizeof(msg));
                printf("input:");
                gets(msg); // //获取键盘数据,存入msg
                write(c_fd, msg, strlen(msg));
            }
        }
        while (1)//我们希望能一直接发
        {
            // read()
            memset(readBuf,0,sizeof(readBuf));
            nread = read(c_fd, readBuf, 128);
            if (nread == -1)
            {
                perror("read");
            }
            else
            {
                printf("get message from server: %d ,%s\n", nread, readBuf);
            }
        }
    }

    return 0;
}

=========================================


case5 : 实现多方消息接收:加个标志确定不同的客户端

每次连接到一个新的客户端mark就 + 1

// 通过mark 标记客户端是序号

#include <stdio.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
// #include<linux/in.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int main(int argc, char **argv)
{
    int s_fd;
    int c_fd;
    int mark=0;
    struct sockaddr_in s_addr;
    struct sockaddr_in c_addr;
    int nread;
    char msg[128]={0};
    char readBuf[128]={0};
    if(argc != 3){// 判断传参是否正确
    puts("Improper parameters");
    exit(-1);
    }
    memset(&s_addr, 0, sizeof(struct sockaddr_in));
    memset(&c_addr, 0, sizeof(struct sockaddr_in));
    int clen = sizeof(struct sockaddr_in);
    // 1. socket -- IPv4  流形式i 0 --默认 TCP
    s_fd = socket(AF_INET, SOCK_STREAM, 0);
    if (s_fd == -1)
    {
        perror("socket");
        exit(-1);
    }
    // 初始化bind需要的struct

    s_addr.sin_family = AF_INET;
    // htons -- h - host to  ns-net short
    s_addr.sin_port = htons(atoi(argv[2])); // 通过传参指定端口
    // a -- ASCLL  传参方式得到IP
    inet_aton(argv[1], &s_addr.sin_addr);

    // 3.bind
    bind(s_fd, (struct sockaddr *)&s_addr, sizeof(struct sockaddr_in));
    // listen
    listen(s_fd, 10);
    // 4.accept
    while (1)
    {
        c_fd = accept(s_fd, (struct sockaddr *)&c_addr, &clen); // 获得新的客户端 描述符
        if (c_fd == -1)
        {
            perror("accept");
        }
        mark++;// 每次连接到一个新的客户端mark就 + 1

        printf("get connect. %s\n", inet_ntoa(c_addr.sin_addr));

        if (fork() == 0)
        { //  创建子进程来处理读写

            if (fork() == 0)
            {             // 创建一个子进程负责发送数据
                while (1) // 我们希望能一直接发
                {
                    memset(msg, 0, sizeof(msg));
                    sprintf(msg,"welcome NO.%d client",mark);
                    write(c_fd, msg, strlen(msg));
                    sleep(5);
                }
            }
            while (1)
            {
                // read()
                memset(readBuf,0,sizeof(readBuf));
                nread = read(c_fd, readBuf, 128);
                if (nread == -1)
                {
                    perror("read");
                }
                else
                {
                    printf("get message : %d ,%s\n", nread, readBuf);
                }
            }
        }
    }
    return 0;
}

===============================================================

后话


 为了解决不能多个窗口交流的问题,我们决定实现以下项目:

先提供思路和介绍,我们将=在下篇实现这个项目


实现ftp 服务器 客户端:
项目思路:

功能:

客户端:
1.获取服务器的文件  get xx
2.展示服务器的文件 ls
3.进入服务器的某个文件夹  cd 
4.上传文件到服务器   put


本地: 
1.ls  -- 查看本地文件
2.lcd 进入客户端 某某文件夹

详情了解请跳转:Linux 网络编程项目--简易ftp-CSDN博客

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

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

相关文章

2024最新Java面试宝典(史上最全,BAT大厂面试必备,用心看完这一篇就够了!)

&#x1f680; 作者 &#xff1a;“二当家-小D” &#x1f680; &#x1f680; 博主简介&#xff1a;⭐前荔枝FM架构师、阿里资深工程师||曾任职于阿里巴巴担任多个项目负责人&#xff0c;8年开发架构经验&#xff0c;精通java,擅长分布式高并发架构,自动化压力测试&#xff0c…

20240416,深拷贝浅拷贝,对象初始化和清理,对象模型和THIS指针

哈哈哈乌龟越狱了 目录 2.5 深拷贝&浅拷贝 2.6 初始化列表 2.7 类对象作为类成员 2.8 静态成员 2.9 成员变量和成员函数分开存储 2.10 THIS指针的用途 2.11 空指针访问成员函数 2.12 COSNT修饰成员函数 2.5 深拷贝&浅拷贝 浅拷贝&#xff1a;简单的赋值拷贝…

二次封装el-carousel

我们创建了一个名为MyCarousel的组件,它接受el-carousel的一些常用属性作为props,并默认提供了一些值。我们还通过setup函数返回了所有props,以便它们可以在模板中被使用。 1.MyCarousel.vue组件 <!-- 轮播图片 --> <template><div class="carousel&q…

Django中的定时任务与后台任务队列的实践

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 在Web开发中&#xff0c;处理定时任务和后台任务队列是很常见的需求。Django作为一个功能强…

vscode中使用rust的跳转定义时,rust-analyzer报错“未找到定义”,如何解决?

本文是关于错误解决的一个记录&#xff0c;如果你在使用vscode编写rust程序的过程中也遇到同样的错误&#xff0c;不妨一试。 我遇到的错误是&#xff0c;在编写的rust程序中想要跳转到当前变量或者函数的定义处&#xff0c;但按下F12无法跳转&#xff0c;且提示“未找到xxx定…

LoggerFactory is not a Logback

错误信息 LoggerFactory is not a Logback LoggerContext but Logback is on the classpath. Either remove Logback or the competing implementation (class org.slf4j.impl.SimpleLoggerFactory loaded from file:/D:/maven/repository/org/slf4j/slf4j-simple/1.7.26/slf…

MySQL学习笔记5——函数和索引

函数和索引 一、函数1、数学函数2、字符串函数3、条件判断函数 二、索引1、索引是什么2、单字段索引3、组合索引4、总结 一、函数 MySQL提供了很多功能强大&#xff0c;而且使用起来非常方便的函数&#xff0c;包括数学函数、字符串处理函数和条件判断函数等。 1、数学函数 …

Python网络数据抓取(3):Requests

引言 在这一部分&#xff0c;我们将探讨Python的requests库&#xff0c;并且利用这个库来进行网页数据抓取。那么&#xff0c;我们为何需要这个库&#xff0c;以及怎样利用它呢&#xff1f; requests库是广受大家欢迎的一个库&#xff0c;它是下载次数最多的。这个库使我们能够…

在windows系统安裝 SQL Server 版本的最低需求

針對對應您的作業系統所要安裝的 SQL Server 版本的最低需求 具体参考&#xff1a;Windows 作業系統的 SQL Server - SQL Server | Microsoft Learn

stable-diffusion-webui安装与使用过程中的遇到的error合集

stable-diffusion-webui1.9.2踩坑安装 1. 安装过程1.1 stable-diffusion-webui1.2 在win11或win10系统安装&#xff0c;需修改两个启动脚本1.2.1 修改webui-user.bat1.2.2 修改webui.bat 1.3 双击 webui-user.bat 启动脚本1.3.1 no module xformers. Processing without on fre…

电力调度自动化中智能电网技术的应用

电力调度自动化中智能电网技术的应用 在现代电网的现代化发展和电网重组工作中起着关键作用,由于此项技术开发时间短,目前还没有形成一个相对清晰的概念,但此技术在未来的电网发展工作中的地位已得到了一些国家的认可。由于智能电网具有良好的兼容性以及交互性等优势,一经推出就…

解决方案 SHUTDOWN_STATE xmlrpclib.py line: 794 ERROR: supervisor shutting down

Supervisor操作命令 重新加载 Supervisor 配置&#xff1a; sudo supervisorctl reread sudo supervisorctl update sudo supervisorctl restart all这将重新读取 Supervisor 的配置文件&#xff0c;更新进程组&#xff0c;然后重启所有进程。 查看 Supervisor 日志&#xff1…

3.SpringCloud版本

1.SpringCloud与SpringBoot之间版本对应 2.服务拆分的注意事项 1.不同微服务&#xff0c;不要重复开发相同业务。 2.微服务的数据独立&#xff0c;每个微服务都有自己独立的数据库&#xff0c;不要访问其他微服务的数据库。 3.微服务可以将自己的的业务暴露为接口&#xff…

婚恋相亲红娘牵线系统源码支持微信小程序+微信公众号+H5+APP社交交友系统搭建,扩展你的社交影响力与人脉资源

当代年轻人晚婚晚育甚至不愿意结婚不愿意相亲等问题愈来愈严重了&#xff0c;但是如果抛开表现去追求本质的话&#xff0c;其实不难发现年轻人们还是会喜欢去找一些志同道合或者聊得来的异性朋友交流&#xff0c;从线上发展到线下的一个流程。 核心系统核心体系是恋爱小贴士、…

【C++】详解初始化列表,隐式类型转化,类静态成员,友元

前言 初始化列表是对构造函数内容的补充&#xff0c;小编会详细的讲解初始化列表的概念&#xff0c;特性&#xff0c;注意点。这是本篇内容的重头戏&#xff0c;小编会先提一个问题来抛砖引玉。 隐式类型转换顾名思义&#xff0c;首先它不需要主动转换&#xff0c;类似于把浮点…

redis原理篇(黑马程序员虎哥 )回忆笔记

原理&#xff0c;老师讲的真好。相见恨晚。 以下内容是按视频课程的章节安排&#xff0c;在我自己听完课之后&#xff0c;凭借记忆总结的。&#xff08;可能存在疏漏不足&#xff0c;后期补全和修正&#xff0c;同时也在这个过程巩固我自己的对于这个组件相关原理的学习&#x…

Qt Debug模式下应用程序输出界面乱码【已解决】

Qt Debug模式下应用程序输出乱码 一、问题描述二、解决方法三、相关测试 一、问题描述 源码为utf-8编码. Qt Creator在Debug模式下运行程序&#xff0c;下方应用程序输出界面显示乱码. 但正常运行无乱码&#xff1a; 二、解决方法 尝试修改文件编码、执行编码无果… 可参考…

主打国产算力 广州市通用人工智能公共算力中心项目签约

4月9日&#xff0c;第十届广州国际投资年会期间&#xff0c;企商在线&#xff08;北京&#xff09;数据技术股份有限公司与广州市增城区政府就“广州市通用人工智能公共算力中心”项目进行签约。 该项目由广州市增城区人民政府发起&#xff0c;企商在线承建。项目拟建成中国最…

RK3568 android11 修改关机弹窗界面

需要修改关机弹窗界面&#xff0c;当前界面我已经按照客户需求去掉emergency 但是客户需要按其他区域可以实现返回&#xff0c;也就是点击黑色背景取消dialog 嗑代码发现黑色布局为&#xff1a; <node index"0" text"" resource-id"com.android.…

逆向修改app就可以游戏充值到账?

hello ,大家好, 现在市场仍然流行着非常多的传奇类游戏私服或者其他类型的游戏私服,随着私服越来越多(很多并不合法),越来越多的人加入了破解,逆向修改,或者代充的队伍并从中获利。这里我给大家分享一下这些做代充的常规的做法,以及大家作为游戏服务器如何避坑做强校验…