0724, 大型补作业现场

news2024/11/15 17:45:12

sock编程

struct sockaddr
struct sockaddr_in  -->   struct in_addr
struct hostent 

htonl()   htons()   ntohl()   ntohs()
int inet_aton(const char* cp,struct in_addr * inp); 
in_addr_t inet_addr(const char* cp);                      
const char* inet_ntop(int af,const void* src,char* dst,socklen_t size);
struct hostent * gethostbyname(const char* name);

client :socket——connect——recv/send——close      (one fd)
server:socket——bind——listen——accept——recv/send——close
        (listendfd)             (peerfd)

int socket (int domain,int type,int protocol);
int bind (int sockfd,const struct sockaddr* addr ,socklen_t addrlen);
int listen (int sockfd,int backlog);
int connect  (int sockfd,const struct sockaddr*addr, socklen_t addrlen);
int accept (int sockfd,struct sockaddr* addr, socklen_t addrlen);
ssize_t recv ( int sockfd,void* buf,size_t buf,int flags);
ssize_t send( int sockfd,void* buf,size_t buf,int flags);

int setsockopt(int sockfd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on));
                          int level ,int opname,const void* optval,socklen_t optlen

靓仔不想抄代码了呜呜,好困 

————————client :
socket
connect
while(1)
close
————————server :
socket
bind
listen
accept
send     //send是阻塞式函数
close




//第一次send可以正常执行,此时因为连接已经断开了,服务器会收到一个RST报文
//第二次send时,服务器会收到一个SIGPIPE信号 ,该信号的默认处理方式是终结进程。
//总结:client的连接关闭,会导致服务器进程奔溃,是一个不能接受的情况,因为服务器要服务其他的客户端。
————————client :
socket
connect
recv
close
————————server :
socket
bind
listen
accept
send    sleep()   send     //服务器往一个已经断开了的连接上继续发送数据,会造成什么影响?      
close



//数据在发送时是字节流,不是一个个的数据包
//数据之间是没有边界的概念  =》 TCP粘包问题

————————client :         
socket
connect
recv    recv
close
————————server :
socket
bind
listen
accept
send   send           
close




//recv的返回值为0的情况

————————client :         
socket
connect
recv    recv
close
————————server :
socket
bind
listen
accept
send      close

723__01:使用select实现一个基于UDP的一对一即时聊天程序。

001:
#include <func.h>
#define IP "192.168.235.128"
#define PORT1 8080
#define PORT2 8081

struct sockaddr* addr_create(const char* ip,int  port ){

    struct sockaddr_in* addr=(struct sockaddr_in*)malloc(sizeof(struct sockaddr_in));
    memset(addr,0,sizeof(*addr));
    addr->sin_family=AF_INET;
    addr->sin_port=htons(port);
    addr->sin_addr.s_addr=inet_addr(ip);
    return (struct sockaddr*)addr;
}

int main()
{
    struct sockaddr* addr=addr_create(IP,PORT1);
    struct sockaddr* addr1=addr_create(IP,PORT2);

    int sockfd=socket(AF_INET,SOCK_DGRAM,0);
    if(sockfd==-1){error(1,errno,"socket");}

    //addr1暴露一下?
    int err=bind(sockfd,addr1,sizeof(*addr));
    if(err==-1){error(1,errno,"bind");}

    int epfd=epoll_create1(0);
    struct epoll_event epev;
    epev.events=EPOLLIN;
    epev.data.fd=sockfd;
    epoll_ctl(epfd,EPOLL_CTL_ADD,sockfd,&epev);
    epev.data.fd=STDIN_FILENO;//标准输入的文件描述符,通常为 0
    epoll_ctl(epfd,EPOLL_CTL_ADD,STDIN_FILENO,&epev);

    struct epoll_event epev_arr[2];
    char buff[4096];


    while(1){
        int num=epoll_wait(epfd,epev_arr,2,-1);
        for(int i=0;i<num;i++){
            int fd=epev_arr[i].data.fd;
            if(fd==STDIN_FILENO){
                fgets(buff,4096,stdin);
                //给addr发消息
                sendto(sockfd,buff,strlen(buff)+1,0,addr,sizeof(struct sockaddr));
            }
            if(fd==sockfd){
                recvfrom(sockfd,buff,4096,0,NULL,NULL);
                printf("REC::%s\n",buff);
            }
        }
    }

    close(sockfd);
    return 0;
}
002:  TIMEWAI  OR  BUG 
#include <func.h>
#define IP "192.168.235.128"
#define IP1 "42.194.149.92"
#define PORT1 8082
#define PORT2 13332

struct sockaddr* addr_create(const char* ip,int  port ){

    struct sockaddr_in* addr=(struct sockaddr_in*)malloc(sizeof(struct sockaddr_in));
    memset(addr,0,sizeof(*addr));
    addr->sin_family=AF_INET;
    addr->sin_port=htons(port);
    addr->sin_addr.s_addr=inet_addr(ip);
    return (struct sockaddr*)addr;
}

int main()
{
    struct sockaddr* addr=addr_create(IP,PORT1);
    struct sockaddr* addr1=addr_create(IP1,PORT2);

    int sockfd=socket(AF_INET,SOCK_DGRAM,0);
    if(sockfd==-1){error(1,errno,"socket");}

    //addr暴露一下
    /* int err=bind(sockfd,addr,sizeof(*addr)); */
    /* if(err==-1){error(1,errno,"bind");} */

    int epfd=epoll_create1(0);
    struct epoll_event epev;
    epev.events=EPOLLIN;
    epev.data.fd=sockfd;
    epoll_ctl(epfd,EPOLL_CTL_ADD,sockfd,&epev);
    epev.data.fd=STDIN_FILENO;//标准输入的文件描述符,通常为 0
    epoll_ctl(epfd,EPOLL_CTL_ADD,STDIN_FILENO,&epev);

    struct epoll_event epev_arr[2];
    char buff[4096];


    while(1){
        int num=epoll_wait(epfd,epev_arr,2,-1);
        for(int i=0;i<num;i++){
            int fd=epev_arr[i].data.fd;
            if(fd==STDIN_FILENO){
                fgets(buff,4096,stdin);
                //给addr1发送消息
                sendto(sockfd,buff,strlen(buff)+1,0,addr1,sizeof(struct sockaddr));
            }
            if(fd==sockfd){
                recvfrom(sockfd,buff,4096,0,NULL,NULL);
                printf("REC::%s\n",buff);
            }
        }
    }

    close(sockfd);
    return 0;
}

721作业:

01:在一对一聊天的基础上,使用select实现一对多的回显服务。(回显服务即接收到客户端发送的数据后,再回复给客户端)

一对一的喵:

//client.c
#include <func.h>
#define IP1 "192.168.235.128"
#define IP2 "42.194.149.92"
#define PORT1 8080
#define PORT2 13332

struct sockaddr* addr_create(const char* ip,int  port ){
    struct sockaddr_in* addr=(struct sockaddr_in*)malloc(sizeof(struct sockaddr_in));
    memset(addr,0,sizeof(*addr));
    addr->sin_family=AF_INET;
    addr->sin_port=htons(port);
    addr->sin_addr.s_addr=inet_addr(ip);
    return (struct sockaddr*)addr;
}

int main()
{
    int sofd=socket(AF_INET,SOCK_STREAM,0);
    if(sofd==-1){error(1,errno,"socket");}

    struct sockaddr* addr=addr_create(IP1,PORT1);
    int err=connect(sofd,addr,sizeof(*addr));
    if(err==-1){error(1,errno,"connect");}
    printf("connect sucess\n");

    fd_set set;
    FD_ZERO(&set);
    char buff[100]={0};

    while(1){
        FD_SET(STDIN_FILENO,&set);
        FD_SET(sofd,&set);
        select(sofd+1,&set,NULL,NULL,NULL);

        if(FD_ISSET(STDIN_FILENO,&set)){
            memset(buff,0,sizeof(buff));
            err=read(STDIN_FILENO,buff,sizeof(buff));
            if(strcmp(buff,"byby\n")==0){break;}
            send(sofd,buff,err-1,0);
        }
        if(FD_ISSET(sofd,&set)){
            memset(buff,0,sizeof(buff));
            err=recv(sofd,buff,sizeof(buff),0);
            if(err==0){printf("byebye\n");break;}
            printf("ret:  %d,recv:%s \n",err,buff);
        }
    }
    close(sofd);
    return 0;
}
//server.c
#include <func.h>
#define IP1 "192.168.235.128"
#define IP2 "42.194.149.92"
#define PORT1 8080
#define PORT2 13332

struct sockaddr* addr_create(const char* ip,int  port ){
    struct sockaddr_in* addr=(struct sockaddr_in*)malloc(sizeof(struct sockaddr_in));
    memset(addr,0,sizeof(*addr));
    addr->sin_family=AF_INET;
    addr->sin_port=htons(port);
    addr->sin_addr.s_addr=inet_addr(ip);
    return (struct sockaddr*)addr;
}

int main()
{
    int sofd=socket(AF_INET,SOCK_STREAM,0);
    if(sofd==-1){error(1,errno,"socket");}

    struct sockaddr* addr=addr_create(IP1,PORT1);
    int err=bind(sofd,addr,sizeof(*addr));
    if(err==-1){error(1,errno,"bimd");}
    printf("bind sucess\n");
    /* struct sockaddr_in*  addrin=(struct sockaddr_in*)addr; */
    /* printf("%s,%d\n",inet_ntoa(addr->sin_addr), */
    /*        sizeof((struct sockaddr_in*)addr.sin.port)); */
    err=listen(sofd,1);
    if(err==-1){error(1,errno,"listen");}

    struct sockaddr_in addr2;
    socklen_t len=sizeof(addr2);
    int peerfd=accept(sofd,(struct sockaddr*)&addr2,&len);
    printf("client :%s:%d has connect\n",inet_ntoa(addr2.sin_addr),
           ntohs(addr2.sin_port));
    // sofd--->peerfd

    fd_set set;
    FD_ZERO(&set);
    char buff[100]={0};

    while(1){
        FD_SET(STDIN_FILENO,&set);
        FD_SET(peerfd,&set);
        select(peerfd+1,&set,NULL,NULL,NULL);

        if(FD_ISSET(STDIN_FILENO,&set)){
            memset(buff,0,sizeof(buff));
            err=read(STDIN_FILENO,buff,sizeof(buff));
            if(strcmp(buff,"byby\n")==0){break;}
            send(peerfd,buff,err-1,0);
        }
        if(FD_ISSET(peerfd,&set)){
            memset(buff,0,sizeof(buff));
            err=recv(peerfd,buff,sizeof(buff),0);
            if(err==0){printf("byebye\n");break;}
            printf("ret:  %d,recv:%s \n",err,buff);
        }
    }
    close(sofd);
    return 0;
}
 一对多的服务器喵:
#include <func.h>
#define IP1 "192.168.235.128"
#define IP2 "42.194.149.92"
#define PORT1 8080
#define PORT2 13332

struct sockaddr* addr_create(const char* ip,int  port ){
    struct sockaddr_in* addr=(struct sockaddr_in*)malloc(sizeof(struct sockaddr_in));
    memset(addr,0,sizeof(*addr));
    addr->sin_family=AF_INET;
    addr->sin_port=htons(port);
    addr->sin_addr.s_addr=inet_addr(ip);
    return (struct sockaddr*)addr;
}

int main()
{
    int sofd=socket(AF_INET,SOCK_STREAM,0);
    if(sofd==-1){error(1,errno,"socket");}

    struct sockaddr* addr=addr_create(IP1,PORT1);
    int err=bind(sofd,addr,sizeof(*addr));
    if(err==-1){error(1,errno,"bimd");}
    printf("bind sucess\n");
    /* struct sockaddr_in*  addrin=(struct sockaddr_in*)addr; */
    /* printf("%s,%d\n",inet_ntoa(addr->sin_addr), */
    /*        sizeof((struct sockaddr_in*)addr.sin.port)); */
    err=listen(sofd,1);
    if(err==-1){error(1,errno,"listen");}

    struct sockaddr_in addr2;
    socklen_t len=sizeof(addr2);
    int peerfd=accept(sofd,(struct sockaddr*)&addr2,&len);
    printf("client :%s:%d has connect\n",inet_ntoa(addr2.sin_addr),
           ntohs(addr2.sin_port));
    // sofd--->peerfd

    fd_set set;
    FD_ZERO(&set);
    char buff[100]={0};

    while(1){
        FD_SET(STDIN_FILENO,&set);
        FD_SET(peerfd,&set);
        select(peerfd+1,&set,NULL,NULL,NULL);

        if(FD_ISSET(STDIN_FILENO,&set)){
            memset(buff,0,sizeof(buff));
            err=read(STDIN_FILENO,buff,sizeof(buff));
            if(strcmp(buff,"byby\n")==0){break;}
            send(peerfd,buff,err-1,0);
        }
        if(FD_ISSET(peerfd,&set)){
            memset(buff,0,sizeof(buff));
            err=recv(peerfd,buff,sizeof(buff),0);
            if(err==0){printf("byebye\n");break;}
            printf("ret:  %d,recv:%s \n",err,buff);
        }
    }
    close(sofd);
    return 0;
}

02:使用select编写聊天室程序:客户端和服务端使用tcp通信;服务端可以处理新客户端的连接和转发消息;客户端可以连入服务端并发送消息。

//server.c
#include <func.h>
#define IP1 "192.168.235.128"
#define IP2 "42.194.149.92"
#define PORT1 8080
#define PORT2 13332

//聊天室服务端
typedef struct conn_s{
    int netfd;
    int isalive;
}conn_t;

struct sockaddr* addr_create(const char* ip,int  port ){

    struct sockaddr_in* addr=(struct sockaddr_in*)malloc(sizeof(struct sockaddr_in));
    memset(addr,0,sizeof(*addr));
    addr->sin_family=AF_INET;
    addr->sin_port=htons(port);
    addr->sin_addr.s_addr=inet_addr(ip);
    return (struct sockaddr*)addr;
}


int main(int argc,char* argv[])
{
    struct sockaddr* addr=addr_create(IP1,PORT1);

    int sofd=socket(AF_INET,SOCK_STREAM,0);
    if(sofd==-1){error(1,errno,"socket");}

    bind(sofd,(struct sockaddr *)&addr,sizeof(addr));
    listen(sofd,10);
    
    //用于管理文件描述符集合,用于指示哪些文件描述符正在监听的 I/O 事件已经发生
    fd_set set;//select 监听的集合
    FD_ZERO(&set);
    FD_SET(sofd,&set);
    
    conn_t list[1024];
    memset(list,0,sizeof(list));
    int index;

    while(1){
        fd_set temp_set;//构建此次的监听合计
        memcpy(&temp_set,&set,sizeof(set));//cp ser temp_set

        select (10,&temp_set,NULL,NULL,NULL);

        if(FD_ISSET(sofd,&temp_set)){
            int netfd=accept(sofd,NULL,NULL);
            list[index].isalive=1;
            list[index].netfd=netfd;
            FD_SET(netfd,&set);//增加监听

            index++;
        }

        for(int i=0;i<index;i++){
            conn_t con=list[i];
            //isalive && isset==has new massege
            if(con.isalive==1&&FD_ISSET(con.netfd,&temp_set)){
                char buff[100]={0};
                int res_recv=recv(con.netfd,buff,sizeof(buff),0);
                if(res_recv==0){
                    //return 0   disconnect
                    list[i].isalive=0;
                    FD_CLR(con.netfd,&set);
                    close(list[i].netfd);
                }else{
                    //recv msg-->send  client
                    for(int j=0;j<index;j++){
                        if(list[j].isalive==0||j==i){
                            continue;
                            //跳过断开连接的客户端,跳过发信息过来的客户端
                        }
                        send(list[j].netfd,buff,sizeof(buff),0);
                    }
                }
            }
        }

    }
    printf("学姐我饿了\n");
    printf("我也是\n");

    close(sofd);
    free(addr);
    return 0;
}

722作业 :

01:使用epoll的流程是怎么样,每一步操作会涉及哪些数据结构?

02:select有哪些缺陷,epoll为什么比较高效?

03:epoll中的水平触发和边缘触发的区别是什么?使用边缘触发时,要注意什么呢?

04:采用TCP协议,通过epoll实现多客户端的回显服务,从而理解epoll的实现流程。
(epoll监听新连接的请求和回显已经建立好连接的消息)

05:使用epoll编写聊天室程序:客户端和服务端使用tcp通信;服务端可以处理新客户端的连接和转发消息;客户端可以连入服务端并发送消息。一个客户端10s未发送消息直接踢出

HTTP协议:

作业:

01:HTTP请求报文和响应报文由哪些部分组成?HTTP常用方法有哪些?HTTP常用状态码有哪些?

02:form-data的boundary起什么作用,有什么限制?

03:HTTP请求报文的报文体可以携带哪些类型的数据,分别是什么,各自有什么特点呢?

04:对称加密和非对称加密有什么区别?简要说明一下HTTPS的握手阶段流程。

05:C++代码实现:尝试实现一个静态网页服务端,返回给客户端一张图片 (提示:读取服务器本地的图片文件,再发送给客户端)

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

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

相关文章

深入理解算数表达式求值:后缀表达式的转换与计算

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd;没人会嘲笑竭尽全力的人&#xff01; 前…

软件渗透测试包括的内容和作用简析

在当今信息技术迅速发展的时代&#xff0c;软件安全已成为企业和用户关注的重中之重。尤其是渗透测试作为一种专业的安全测试方法&#xff0c;日益受到企业们的重视。   软件渗透测试是一种模拟恶意攻击者的方式&#xff0c;对软件及其相关系统进行评估&#xff0c;以发现可能…

html基础及python web开发

1.标签 ①p标签 段落标签&#xff0c;分隔段与段。 <p>...</p> ②h标签 标题标签h1-6&#xff0c;大小依次减小 <h1>...</h1> <h2>...</h2> <h3>...</h3> <h4>...</h4> <h5>...</h5> <h6>.…

数据结构的概念和术语

目录 一.前言 二.数据结构的基本概念 三.数据结构的术语 一.前言 数据结构是一门研究非数值计算的程序设计中计算机的操作对象以及它们之间的关系和操作的学科。数据结构的基本数据结构包括两部分&#xff0c;线性结构跟非线性结构。 二.数据结构的基本概念 数据结构主要包括…

MarkTool集合篇

MarkTool目前包含以下几种工具 1、TCP客户端 2、TCP服务端 3、UDP客户端 4、Web客户端 5、Web服务端 6、串口网口 7、PLC 8、获取本机设备 9、Log 10、密钥 11、系统设置 11-1、基本设置 11-2、角色设置 11-3、用户设置 11-4、log记录 开启软件需要找我解密&#…

怎样做好仓库管理工作?如何利用仓库管理系统进行有效管理?

我前前后后跑遍了十几家仓储设备公司&#xff0c;跟那些制造业的朋友们聊了个痛快&#xff0c;从他们那儿学到了不少仓库管理的实践方法。 回来自己整理了一套仓库管理更高效的实用方法&#xff0c;现在就来跟大家伙儿聊聊仓库管理中那些常见问题&#xff0c;以及我是怎么琢磨…

(前缀和) LeetCode 238. 除自身以外数组的乘积

一. 题目描述 原题链接 给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&…

HarmonyOS网络请求的简单用法,HttpUtil简单封装

请求网络获取数据 点击按钮发送一个post请求&#xff0c;发送一条string由于此处的返回result.data本身就是一个string&#xff0c;因此不需要转换类型 Button(请求网络).margin({ top: 10 }).fontSize(24).fontWeight(FontWeight.Bold).onClick(() > {httpRequestPost(http…

算法从零到精通 (一) ~ 快慢双指针

1. 前言 快慢双指针是一种常用的算法技巧&#xff0c;通常用于解决涉及链表或数组的问题。它的基本思想是使用两个指针&#xff0c;一个移动速度快&#xff08;快指针&#xff09;&#xff0c;一个移动速度慢&#xff08;慢指针&#xff09;&#xff0c;来解决特定的问题。这两…

【高可用】利用AOP实现数据库读写分离

最近项目中需要做【高可用】数据库读写分离相关的需求&#xff0c;特地整理了下关于读写分离的相关知识。项目中采用4台数据库&#xff1a;1个master&#xff0c;2个slave&#xff0c;1个readOnly&#xff0c;其中master数据库会自动定时同步到readOnly节点。可以通过中间件(Sh…

Mysql —— 事务

目录 什么是事务&#xff1f; 两种方式实现事务&#xff1a; 方法一 方法二&#xff1a; 事务四大特性(简称ACID) 并发事务问题&#xff08;面试题&#xff09; 事务隔离级别 什么是事务&#xff1f; 事务是一组操作的集合&#xff0c;它是一个不可分割的工作单位&#xff…

跨域浏览器解决前端跨域问题

1.问题背景 这是一种属于非主流的解决跨域的方案&#xff0c;但是也是可以正常使用而且比较简单的。如果需要使用主流的解决前端跨域方案&#xff0c;请参考这篇文章。 我这边其实是优先建议大家使用主流的跨域方案&#xff0c;如果主流的实在不行&#xff0c;那么就使用跨域…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 图像物体的边界(200分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 🍿 最新华为OD机试D卷目录,全、新、准,题目覆盖率达 95% 以上,支持题目在线…

scratch绘制十个圆 2024年6月中国电子学会图形化编程 少儿编程 scratch编程等级考试三级真题和答案解析

目录 scratch绘制十个圆 一、题目要求 1、准备工作 2、功能实现 二、案例分析 1、角色分析 2、背景分析 3、前期准备 三、实现流程 1、案例分析 2、详细过程 四、程序编写 五、考点分析 六、推荐资料 1、入门基础 2、蓝桥杯比赛 3、考级资料 4、视频课程 5、…

css气泡背景特效

css气泡背景特效https://www.bootstrapmb.com/item/14879 要创建一个CSS气泡背景特效&#xff0c;你可以使用CSS的伪元素&#xff08;:before 和 :after&#xff09;、border-radius 属性来创建圆形或椭圆形的“气泡”&#xff0c;以及background 和 animation 属性来设置背景…

mysql 先子查询过滤再联合 和 先联合再过滤 执行效率问题

执行顺序 先子查询过滤再联合 SELECT XXX FROM(select * from edw_data_dyd.overrun_offsite_info WHERELENGTH( VEHICLE_ID ) > 12 AND CREATED_TIME > DATE_ADD(NOW(),INTERVAL -1 HOUR)AND CREATED_TIME < NOW()AND VEHICLE_ID not like %无车牌%AND VEHICLE_I…

华为ICT大赛之ensp软件BGP原理与配置

BGP基础 1.用于不同自治系统AS(autonomous system)之间动态交换路由信息&#xff1b; BGP取代EGP(exterior gateway protocol)外部网关协议&#xff0c;BGP在其发布路由信息基础上可以进行路由优选&#xff0c;高效处理路由信息&#xff1b; AS:同一组织管理下&#xff0c;使…

全面解析 SnowNLP:中文文本处理、情感分析

1 前言 SnowNLP 是一个专门用于处理中文文本的 Python库。功能包括&#xff1a; 分词情感分析关键词提取文本分类拼音转换繁体转简体词相似度计算等 snownlp0.12.3测试环境&#xff1a;Python3.10.9 2 分词 中文分词&#xff08;Character-Based Generative Model&#xf…

WEB渗透Web突破篇-前端突破

逻辑漏洞 1.任意用户注册 2.用户名枚举 3.爆破用户名&#xff0c;密码 4.用户名注入 5.万能密码 6.用户名Xss 7.修改返回包信息&#xff0c;登入他人账户 8.修改cookie中的参数&#xff0c;如user,adminid等 9.HTML源码、JS等查看信息搜集那一章 10.后台登录参数修改…

MSPM0G3507学习笔记1:开发环境_引脚认识与点灯

今日速通一款Ti的单片机用于电赛&#xff1a;MSPM0G3507 这里默认已经安装好了Keil5_MDK 首先声明一下: 因为是速成&#xff0c;所以需要一定单片机学习基础&#xff0c;然后我写的也不会详细&#xff0c;这个专栏的笔记也就是自己能看懂就行的目标~~~ 文章提供测试代码解…