使用C++从零开始,自己写一个MiniWeb

时间:2024-02-11 22:43:45 标签:  从零开始  

第一步:新建项目

1、打开VS点击创建新项目

2、选择空项目并点下一步(切记不能选错项目类型)

3、填写项目名称和路径,点击创建即可

 

新建好后项目是这样的比较干净 

4、右击源文件,点击添加,新建http.cpp文件

第二步:前期准备

在http.cpp最上面引入依赖,并撰写main方法,打印错误日志的方法

#include<stdio.h>
#include<string.h>
#include<WinSock2.h>
#include<sys/types.h>
#include<sys/stat.h>
#pragma comment(lib,"WS2_32.lib")
#define PRINTF(str) printf("[%s - %d]"#str"%s",__func__,__LINE__,str);//打印错误日志
void error_die(const char* str) {perror(str);exit(1);}int main(void) {return 0;
}

第三步:网络初始化

初始化可以分为五步:1、网络通讯初始化===>>>2、创建套接字===>>>3、绑定端口===>>>4、绑定套接字===>>>5、创建监听队列

代码实现如下:

int startup(unsigned short *port) {//1、网络通讯初始化WSADATA data;int res = WSAStartup(MAKEWORD(1,1), &data);if (res) {error_die("init fail");}//2、创建套接字int server_socket = socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);if (server_socket == -1) {error_die("sock create fail");}//3、绑定端口int opt = 1;res = setsockopt(server_socket,SOL_SOCKET,SO_REUSEADDR,(const char*) & opt, sizeof(opt));if (res) {error_die("port bing fail");}//4、绑定套接字struct sockaddr_in server_addr;memset(&server_addr,0,sizeof(server_addr));server_addr.sin_family = AF_INET;server_addr.sin_port = htons(*port);server_addr.sin_addr.s_addr = htonl(INADDR_ANY);res = bind(server_socket,(struct sockaddr*) &server_addr, sizeof(server_addr));if (res<0) {error_die("sock bing fail");}//5、创建监听队列int nameLen = sizeof(server_addr);if (*port == 0) {res = getsockname(server_socket, (struct sockaddr*)&server_addr,&nameLen);if (res) {error_die("dynamic sock create fail");}*port = server_addr.sin_port;}res = listen(server_socket, 5);if (res < 0) {error_die("listen queque create fail");}return server_socket;};

main方法修改如下:

int main(void) {//1、初始化unsigned short port = 8000;int server_sock = startup(&port);printf("http have benn started ,listening [%d] port...",port);return 0;
}

第四步:处理用户请求

1、报文背景知识

浏览器发起新的访问时,会向服务器端发送一个请求报文。例如,在浏览器地址输入 127.0.0.1:8000 回车后,服务器端收到的完整报文如下:

GET / HTTP/1.1\n
Host: 127.0.0.1:8000\n
Connection: keep-alive\n
Cache-Control: max-age=0\n
Upgrade-Insecure-Requests: 1\n
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36\n
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9\n
Sec-Fetch-Site: none\n
Sec-Fetch-Mode: navigate\n
Sec-Fetch-User: ?1\n
Sec-Fetch-Dest: document\n
Accept-Encoding: gzip, deflate, br\n
Accept-Language: zh-CN,zh;q=0.9\n
\n

请求报文由4四个部分组成:请求行、请求头部行、空行、请求数据。具体格式如下:

2、具体处理

具体处理代码如下:

//从指定的客户端套接字读取一行数据,保持到buff中,返回实际读取到了字节数
int get_line(int sock, char* buff, int size) {char c = 0;int i = 0;while (i < size - 1 && c != '\n') {int n = recv(sock, &c, 1, 0);if (n > 0) {if (c == '\r') {n = recv(sock, &c, 1, MSG_PEEK);if (n > 0 && c == '\n') {recv(sock, &c, 1, 0);}else {c = '\n';}}buff[i++] = c;}else {c = '\n';}}buff[i] = 0;return 0;
}//向指定套接字,发送一个未支持提示还没有实现的错误页面
void unimplement(int client) {char buf[1024];sprintf(buf, "HTTP/1.0 501 Method Not Implemented\r\n");send(client, buf, strlen(buf), 0);sprintf(buf, SERVER_STRING);send(client, buf, strlen(buf), 0);sprintf(buf, "Content-Type: text/html\r\n");send(client, buf, strlen(buf), 0);sprintf(buf, "\r\n");send(client, buf, strlen(buf), 0);sprintf(buf, "<HTML><HEAD><TITLE>Method Not Implemented\r\n");send(client, buf, strlen(buf), 0);sprintf(buf, "</TITLE></HEAD>\r\n");send(client, buf, strlen(buf), 0);sprintf(buf, "<BODY><P>HTTP request method not supported.\r\n");send(client, buf, strlen(buf), 0);sprintf(buf, "</BODY></HTML>\r\n");send(client, buf, strlen(buf), 0);}//向指定套接字,发送一个未支持提示还没有实现的错误页面
void not_found(int client) {char buf[1024];sprintf(buf, "HTTP/1.0 404 NOT FOUND\r\n");send(client, buf, strlen(buf), 0);sprintf(buf, SERVER_STRING);send(client, buf, strlen(buf), 0);sprintf(buf, "Content-Type: text/html\r\n");send(client, buf, strlen(buf), 0);sprintf(buf, "\r\n");send(client, buf, strlen(buf), 0);sprintf(buf, "<HTML><TITLE>Not Found</TITLE>\r\n");send(client, buf, strlen(buf), 0);sprintf(buf, "<BODY><P>The server could not fulfill\r\n");send(client, buf, strlen(buf), 0);sprintf(buf, "your request because the resource specified\r\n");send(client, buf, strlen(buf), 0);sprintf(buf, "is unavailable or nonexistent.\r\n");send(client, buf, strlen(buf), 0);sprintf(buf, "</BODY></HTML>\r\n");send(client, buf, strlen(buf), 0);}//发送响应的头信息
void headers(int client) {char buff[1024];strcpy(buff, "HTTP/1.0 200 OK\r\n");send(client, buff, strlen(buff), 0);strcpy(buff, "Server:MyHttpd/0.1\r\n");send(client, buff, strlen(buff), 0);strcpy(buff, "Content-type:text/html\n");send(client, buff, strlen(buff), 0);strcpy(buff, "\r\n");send(client, buff, strlen(buff), 0);}//发送文件
void cat(int client,FILE* resource) {char buff[4096];int count = 0;while (1) {int ret = fread(buff, sizeof(char), sizeof(buff), resource);if (ret <= 0) {break;}send(client, buff, ret, 0);count += ret;}printf("total send [%d] to client\n",count);
}void server_file(int client,const char* fileName) {char numchars = 1;char buff[1024];while (numchars > 0 && strcmp(buff, "/n")) {numchars = get_line(client, buff, sizeof(buff));PRINTF(buff);}FILE* resource = fopen(fileName,"r");if (resource==NULL) {not_found(client);}else {//发送头信息headers(client);//发送文件cat(client, resource);printf("file send success");}fclose(resource);}DWORD WINAPI accept_request(LPVOID arg) {char buff[1024];int client = (SOCKET)arg;//1、获取第一行int numchars = get_line(client, buff,sizeof(buff));PRINTF(buff);char method[255];int j = 0 ,i =0;while (!isspace(buff[j])&&i < sizeof(method)-1) {method[i++] = buff[j++];}method[i] = 0;PRINTF(method);//2、检查请求方法是否支持if (stricmp(method,"GET")&& stricmp(method, "POST")) {//向浏览器返回错误提示页面unimplement(client);return 0;}//3、解析资源路径char url[255];i = 0;while (isspace(buff[j]) && j < sizeof(buff)) {j++;}while (!isspace(buff[j])&& sizeof(url)-1 && j < sizeof(buff)) {url[i++] = buff[j++];}url[i] = 0;PRINTF(url);char path[512] = "";sprintf(path, "htdocs%s", url);if (path[strlen(path)-1]=='/') {strcat(path, "index.html");}PRINTF(path);struct stat status ;if (stat(path,&status)==-1) {//把请求包里的东西读完while (numchars>0&&strcmp(buff,"/n")) {numchars = get_line(client, buff, sizeof(buff));}PRINTF(buff);not_found(client);}else {if ((status.st_mode & S_IFMT)==S_IFDIR) {strcat(path, "index.html");}server_file(client,path);}closesocket(client);return 0;
}

github地址:

https://github.com/1756336885/miniWeb.git

gitee地址:

miniWeb: 迷你版的web,用C++撰写,后期会添加数据库,中间件相关的操作

参考文章:

2-创建项目_哔哩哔哩_bilibili

C语言手写HTTPD网站服务器_126775241csdn-CSDN博客

来源:分享自作者个人站点/博客

智能推荐

第一步&#xff1a;新建项目 1、打开VS点击创建新项目 2、选择空项目并点下一步&#xff08;切记不能选错项目类型&#xff09;

标签:从零开始  

目标前段时间打造了一款简单易用功能全面的图片上传组件,现在就来将上传的图片以图片集的形式展现到App上。出于用户体验考虑,加载新图片采用[无限]滚动模式,Android平台上我们优选RecyclerView组件。显示图片,用的自然是ImageView,然而它并不支持直接加载网络图片,需要先通过其它网络组件(如HttpURLConnection、okhttp3等)将图片获取到本地,得到BitMap数据,然后通过setImageBitmap()加载。

标签:从零开始  app  Recyclerview  

Dagger2是一个IOC框架,一般用于Android平台,第一次接触的朋友,一定会被搞得晕头转向。它延续了Java平台Spring框架代码碎片化,注解满天飞的传统。尝试将各处代码片段串联起来,理清思绪,真不是件容易的事。更不用说还有各版本细微的差别。与Spring不同的是,Spring是通过反射创建对象的,而Dagger2是[通过apt插件]在编译期间生成代码,这些生成的代码负责依赖对象创建。本文旨在以简单通俗易懂的方式说明如何使用Dagger2,对其背后设计不做深入探讨。人生苦短,码农更甚,先知其然等有空时再知其所以然,不失为撸App的较好实践。

标签:从零开始  app  

工欲善其事必先利其器。像我们从零开始撸一个App的话,选择最合适的语言是首要任务。如果你跟我一样对Java蹒跚的步态和僵硬的语法颇感无奈,那么Kotlin在很大程度上不会令你失望。虽然为了符合JVM规范和兼容Java,它引入了一些较为复杂的概念和语法,很多同学就是因此放弃入门。其实越深入进去,就会越欲罢不能。除了Android开发,博主也常在后端使用Kotlin编码,有时因为某些原因同时使用Java混编。总的来说,能减少代码量,提高生产效率,似乎代码结构也更清晰了。如果你没有Kotlin的经验,但是比较过Java和C#,你就明白我的意思了,甚至Kotlin有些地方比C#还方便。可以说Kotlin既有C#便捷的语法,亦背靠Java平台良好的生态,那么你还在犹豫什么?

标签:从零开始  app  Kotlin  

文章目录 一、前言二、源码编译&#xff08;一&#xff09;安装Msys2&#xff08;二&#xff09;配置GCC工具链&#xff08;三&#xff09

标签:自己的  

Fragment简介Fragment自从Android 3.0引入开始,刚接触的同学会把它与Activity的关系类比于html片段和html页面的关系,其实是不准确的。前者更多的是组件的概念,需要在运行时有一套管理机制;而后者侧重于布局编写阶段,Android中复用布局我们一般使用<include layout=@layout/xxx/>标签。Fragment实例由Activity的FragmentManager管理,其生命周期和Activity一样,都不是由开发人员而是由系统维护的。自然而然的,每

标签:从零开始  app  Fragment  

路由树上一章最后我们写到了处理restful风格的api。但是实现的太简陋了。自然我们需要一个路由树来处理请求。那么我们从最简单的情况开始。最简单的路由树1.不考虑路径参数问题。2.不考虑路由冲突。3.不考虑性能问题。那么我们自然就可以得到树的结构定义,Tree记录根节点,path表示节点本身的路径,children表示子节点的路径

标签:从零开始  有多难  Web  

文章目录 一、前言往期回顾 二、CPU虚拟化&#xff08;一&#xff09;相关源码&#xff08;二&#xff09;举个

标签:自己的  

文章目录 前言一、C&#43;&#43;关键字二、命名空间2.1引子2.2命名空间定义2.3命名空间的使用

标签:第一篇  

这里我们来使用SDL2从零开始制作一个基础的粒子系统。最后的成果像下面这样:基础理论首先我们来看一下实现粒子系统需要哪些基础理论。粒子系统中最基本需要三个东西:世界:用于对发射出来的粒子操控,产生物理运动粒子发射器:用于发射粒子我们在世界中会维护一个粒子池。每次发射器需要从粒子池里面将没有发射出去的粒子拿出来发射,世界会自动计算已经发射

标签:粒子  从零开始  系统  

最近在研究ebpf的应用,网上对较低版本的内核和centos操作系统的相关资料较少,这里记录一个自己环境配置&编译运行一个ebpf的helloworld程序的过程。环境是centos7.9,虚拟机安装内存需要分配高一些,后续编译llvm很吃性能基础依赖安装升级内核版本ebpf需要至少内核是4.9+以上的版本,这里选择了4.18版本的内核下载4.18版本内核的安装包,下载链接# 安装4.18版本的内核yum inst

标签:从零开始  程序  ebpf  helloworld  

配置从配置的种类来说,我们的配置可以分成四大类。环境变量Cluster,Environment,AppID,Host之类的环境信息,都是通过在运行时平台注入容器或者物理机。静态配置资源初始化时需要的配置信息,如redis,db等,这类资源在线变更配置的风险非常大,通常不鼓励在线变更,很可能会导致业务出现不可预期的事故

标签:从零开始  有多难  配置管理  

Git 是一种非常强大的版本控制系统&#xff0c;它可以帮助您在多人协作开发项目中更好地管理代码版本&#xff0c;并确保每个团队成员都能及时地获取最新的代码更改。在使用 Git 进行版本控制之前&#xff0c;您需要先进行一些设置&#xff0c;以确保您的代码能够顺利地与远程仓库同步。 一&#xff1a;安装 Git: 首先&#xff0c;您需要确保您的计算机上已经安装了 Git。

标签:使用指南  

wmproxywmproxy将用Rust实现http/https代理, socks5代理, 反向代理, 静态文件服务器,后续将实现websocket代理, 内外网穿透等, 会将实现过程分享出来, 感兴趣的可以一起造个轮子法项目地址gite: https://gitee.com/tickbh/wmproxygithub: https://github.com/tickbh/wmproxy日志功能

标签:从零开始  功能  工具  Rust  nginx  

在做了 1~3 的基础工作后,我们的开发环境基本 OK 了,我们可以开始尝试利用 pyopengl 来进行绘制了。本文主要有三个部分利用 glfw 封装窗口类,并打开窗口;封装 shader 类,进行编译、链接、使用;封装 VAO、VBO、EBO完成主函数进行绘制完整的代码在仓库 (tag: v0.1) https://github.com/MangoWAY/CGLearner/tree/v0.11. 利用 glfw 封装窗口类为

标签:正方形  从零开始  CG  pyopengl  

近十年来&#xff0c;前端非常火爆&#xff0c;前端从根本上解决了困扰Web开发者数十年来的难题。当前常用的前端技术栈有react、vue和angularjs等。 那么如何开始一个自己的Vue工程呢&#xff1f;有没有像react那样的脚手架呢&#xff1f; 有的&#xff0c;vue通常使用Vue CLI脚手架。Vue CLI 是一个官方提供的标准工具&#xff0c;用于快速搭建和管理Vue.js项目。下面&#xff0c;按照以下步骤&#xff0c;实现自己的第一个hello world VUE工程吧。 1、安装 Node.js&#xff1a; Vue CLI 需要 Node.js 环境&#xff0c;因此首先安装

标签:自己的  

《Python编程,从入门到实践》这本书是美国的Eric Matthes的著作,这本书是一本针对所有层次的Python 读者而作的Python 入门书。通过这本书,我从零基础开始学习Python。搭建编程环境1安装PythonPyhton的官网地址:https://www.python.org/。打开Pyhton官网,点击Download,就能下载Python的各个版本。

标签:从零开始  python  

目录0 从零开始的Java RASP实现(一)1 javaagent1.1 Main方法启动前概念介绍:如何使用创建agent创建main1.2 JVM启动后attach机制启动一个长时间运行的jvm打包一个agentmain代理jar运用attach参考0 从零

标签:从零开始  java  RASP  

wmproxywmproxy将用Rust实现http/https代理, socks5代理, 反向代理, 静态文件服务器,后续将实现websocket代理, 内外网穿透等, 会将实现过程分享出来, 感兴趣的可以一起造个轮子法项目 wmproxygite: https://gitee.com/tickbh/wmproxygithub: https://github.com/tickbh/wmproxy

标签:从零开始  源码  工具  upstream  nginx  

实战可行&#xff0c;vue3&#43;vite&#43;ts实现

标签:画图  

概述当我们把设计稿和技术选型定下来之后,接下来就要开始着手画这个依赖图了。依赖图的组成最简单的就是节点Node 和节点之间的连线。这一节我们要处理的就是节点位置信息的处理。为了确定节点的位置信息,首先要给节点分层,分层的信息取决于节点之间的依赖关系。问题分析当前我们默认图是从上到下布局方式,节点分层,最容易想到的就是拓扑排序,通过BFS 宽度优先遍历,计算每个节点的步长。自顶向下BFS

标签:自己的  作业  算法  从零开始  布局  

项目代码项目代码体验一下空格开始,左右箭头控制移动体验一下Phaser简介Phaser是一个HTML5游戏框架。它使用了许多HTML5 API,例如Canvas,WebGL,Audio,Gamepad等,并添加了一些有用的逻辑,例如管理游戏循环并为我们提供了物理引擎。使用Phaser,我们可以只用HTML,CSS和JavaScript来构建2D游戏。项目需求在使用Phaser构建Breakout克隆之前,让我们首先定义游戏的范围:

标签:从零开始  入门教程  打砖块  游戏  

wmproxywmproxy将用Rust实现http/https代理, socks5代理, 反向代理, 静态文件服务器,后续将实现websocket代理, 内外网穿透等, 会将实现过程分享出来, 感兴趣的可以一起造个轮子项目 ++wmproxy++gite: https://gitee.com/tickbh/wmproxygithub: https://github.com/tickbh/wmproxy

标签:算法  从零开始  工具  nginx  deflate  

从零开始实现消息队列 .什么是消息队列需求分析核心概念模型 .

标签:队列  

目录 前言 select系统调用 poll系统调用 epoll系统调用

标签:基础知识  

猜你喜欢

从零开始&#xff1a;Linux systemd Unit文件编写全攻略 引言基础知识Systemd简介Unit文件的概念Unit文件的类型

标签:全攻略  

人工智能发展日新月异&#xff0c;大模型技术越发成熟。作为IT程序员的我们&#xff0c;不掌握点大模型技术知识怎么行。本文介绍怎么在自己电脑本地从零开始搭建属于自己的大模型&#xff0c;可以离线使用&#xff0c;不像网上文章讲的依赖openai &#xff0c;  百度文心一言等 API接口。 首先了解下大模型是什么&#xff1f;通俗来讲&#xff0c;大模型就是输入大量语料&#xff0c;来让计算机获得类似人类的“思考”能力&#xff0c;使之能够理解自然语言&#xff0c;能够进行『文本生成』、『推理问答』、『对话』、『文档摘要』等工作。 大家对于chatGPT耳熟能详&#xff0c; 像GPT3.5&#xff0c; GPT4.0大模型&#

标签:自己的  

概述分层布局弄好之后,每一层的节点上下的相对位置基本确定了,我们最简单的方式,就是每一层平铺所有节点,节点宽度固定以及间距固定,每个节点的位置基本就确定了。我们只要基于这些节点进行连线就可以了。方案思路直线方式最简单的方式就是直线,我们只要确定两个节点之间的相对具体坐标,然后两点之间画一条直线就可以了。效果如下

标签:自己的  作业  节点  从零开始  简单  

wmproxywmproxy将用Rust实现http/https代理, socks5代理, 反向代理, 静态文件服务器,后续将实现websocket代理, 内外网穿透等, 会将实现过程分享出来, 感兴趣的可以一起造个轮子法项目地址gite: https://gitee.com/tickbh/wmproxygithub: https://github.com/tickbh/wmproxy为什么我们

标签:从零开始  源码  主动  工具  健康  

前言从最开始的小公司做小网站,到现在进入现在的公司做项目,发现小公司里很多很多工作都是重复的劳动(增删改查),不过想想也是,业务软件最基础的东西不就是增删改查吗。但是很多时候,这种业务逻辑其实没有必要挨个重写。总不能说你的增删改查比我的高级很多。很大程度上,复杂的问题只是数据太多了怎么优化。&nbsp;简介在真的开始做之前,先来简单介绍几个概念。简单介绍一下PaaS是什么,大概意思就是已经做好了一个大的平台,你可以在上边快速的配置、扩展你的服务。详细的介绍推荐看一下阮一峰老师的博客&nbsp;http://www.ruany

标签:从零开始  要做什么  平台  Paas  

为了避免和host的编译系统耦合,很多sdk和需要和客户联编的软件都会提供自己的工具链或者要求客户的系统满足某种工具链要求。大概梳理下来独立的ToolChain 有如下一些好处:&nbsp;1.&nbsp;不用关心host操作系统,只要下载toolchain,随时随地(前提是x86的Linux操作系统,Windows和arm的Linux上也可以做,不过需要单独做,每增加一套,会有更多的维护成本)可以编译。2.&nbsp;部分编译器补丁,操作系统不一定会发,这时需要对toolchain单独打补丁,如果用host的编译工具,要考虑补丁之后和OS本身的兼容性。3.&nbsp;arm当前本身性能比x86还是差不少,而且公司内部arm的服务器数量有

标签:从零开始  工具  gcc  

1. 项目介绍 随着技术的迅速发展和数字化的深入&#xff0c;拥有一个个人博客已经不再是一项奢侈的需求。无论你是一个技术爱好者还是新手入门者&#xff0c;想要分享想法、知识、兴趣点&#xff0c;或者只是想要在网络空间留下足迹&#xff0c;搭建一个属于自己的博客都是一个明智的选择。在这篇文章中&#xff0c;我将向你们揭示如何从零开始&#xff0c;一步一步地建立起个人博客。 WordPress 博客介绍 WordPress是一个开源的自由软件&#xff0c;主要用于网站内容管理系统&#xff08;CMS&#xff09;&#xff0c;但也可以用于创建各种不同类型的网站&#xff0c;包括博客&#xff0c;电子

标签:博客  

  至此,我们已经拥有了控制基本几何图元的能力,那么这些基本的数学库能为我们做些什么呢?现在我来画第二个三角形。本节的代码利用了第1.1节中显示Windows窗口的部分,对于目前我们来说,利用什么API和平台显示图形并不重要,我们的目的是将图形画在一张Buffer代表的图上,有了这个基础以后,利用任务图形API,在任何平台,我们的目的只不过是在一张Buffer上画图而已。 现在我们有了Triangle类,可以利用它来进行如下代码的定义:Trianglef triangle(Vector3f(-1.f, -

标签:角形  第二个  游戏开发  从零开始  

Pytorch从零开始实战——ResNeXt-50算法实战 本系列来源于365天深度学习训练营 原作者K同学 文章目录 Pytorch从零开始实战——ResNeXt-50算法实战

标签:实战  

Pytorch从零开始实战——ResNeXt-50算法的思考 本系列来源于365天深度学习训练营 原作者K同学 对于上次ResNeXt-50算法&#xff0c;我们同样有基于TensorFlow的实现。具体代码如下。

标签:实战  

Pytorch从零开始实战——生成对抗网络入门 本系列来源于365天深度学习训练营 原作者K同学 文章目录 Pytorch从零开始实战——生成对抗网络入门

标签:实战  

Pytorch从零开始实战——人脸图像生成 本系列来源于365天深度学习训练营 原作者K同学 文章目录 Pytorch从零开始实战——人脸图像生成环境准

标签:实战  

要用Python写一个网站,你可以使用Python的Web框架来开发。常见的Python Web框架包括Django、Flask、Bottle等。以下是一个简单的使用Flask框架开发的示例。1. 安装Flask在开始开发之前,你需要安装Flask框架。你可以使用以下命令来安装:pip install flask2. 创建Flask应用在安装完Flask之后,你可以创建一个Flask应用。以下是一个简单的示例:

标签:零用  简易  框架  网站  Flask  

环境&#xff1a;Windows &#43; PS5一台 问题&#xff1a;PS5折腾需要使用PKG浏览器访问特定网址&#xff0c;如何自定义网址呢&#xff1f; 解决办法&#xff1a;使用开发套件PS Multi Too

标签:从零开始  

从零搭建符合自己需求的开发环境本文长期持续更新中,保持和自己实际开发环境一致,欢迎关注交流讨论!前言这篇文章,一是总结自己,二是给新上道的小白一些思路,三是 何时能重组大学时的EXplosion工作组呢?现状分析个人自述成长于一个有着IT背景的家庭,从小学到大学疯狂参加各种机器人比赛,曾多次获得国一等。北京211本科,专业先后为 电子信息工程 -> 计算机科学与技术 -> 虚拟化与云基础设施,在法国

标签:需求  环境  

基本电路认识电路  图中是一个普通的电路,要看懂各种电路图的前提是认识元器件。图中共有三个元器件,分别为: 电源(多节电池)

标签:从零开始  电路  

wmproxywmproxy是由Rust编写,已实现http/https代理,socks5代理, 反向代理,静态文件服务器,内网穿透,配置热更新等, 后续将实现websocket代理等,同时会将实现过程分享出来, 感兴趣的可以一起造个轮子法项目地址gite: https://gitee.com/tickbh/wmproxygithub: https://github.com/tickbh/wmproxy配

标签:从零开始  原理  工具  数据  nginx  

wmproxywmproxy将用Rust实现http/https代理, socks5代理, 反向代理, 静态文件服务器,后续将实现websocket代理, 内外网穿透等, 会将实现过程分享出来, 感兴趣的可以一起造个轮子法项目 ++wmproxy++gite: https://gitee.com/tickbh/wmproxygithub: https://github.com/tickbh/wmproxy

标签:转成  从零开始  工具  nginx  toml  

文章目录 一、类的定义二、类的访问限定符及封装三、类的作用域四、类的实例化五、类对象模型5.1计算对象的大小5.2结构体内存

标签:第二篇  

文章目录 一、泛型编程二、函数模板2.1函数模板概念2.2函数模板格式2.3函数模板原理2.4函数模板实例化2.5函数模板匹

标签:从零开始  

从零开始&#xff1a;使用 Systemd 管理 Linux 服务的完全指南 引言Systemd 简介Systemd 与 SysVinit 的主要区别

标签:从零开始  

01.nano指令 我们在Windows中有很多的编译环境&#xff0c;大家应该都很熟悉&#xff0c;但是在Linux中&#xff0c;我们怎么写代码呢&#xff1f; 这里&#xff0c;我介绍一个非常简单的指令->nano 这个指令就类似于我们Windows中的记事本&#xff0c;使用方法也很简单 02.nano指令的使用 介绍 nano指令的使用主要分为五步 创建.c文件nano 源文件.cgcc code.c./a.out 演示 具体

标签:自己的  

webpack这类的打包工具,能帮助我们把用esModule组织起来的代码打包到一个js文件中,在浏览器中运行。实现前端项目的模块化,同时优化请求数量,文件大小等。话不多说,我们自己来实现一个类似的bundler,对模块化的前端代码进行打包,输出能在浏览器运行的js文件。准备工作先来看看我们要处理的项目是怎么组织的,我们放一个src文件夹,里面放上index.js,hello.js,word.js每个文件的内容如下//index.jsimport hello from ./hello.jsconsole.log(hello)

标签:自己的  原理  webpack  bundler  

文章目录 1、下载 MySQL 安装程序2、安装 MySQL 要操作 MySQL &#xff0c;首先要安装 MySQL &#xff0c;本文将一步步展示如何安装 My

标签:从零开始  

linux下vim用习惯了...然后就给自己win下vscode也装了个vim插件&#xff0c;用下来还是感觉不顺手&#xff0c;并且处理太多文本时有明显卡顿&#xff0c;于是乎自己配了下win版的vim。 不过好像也并不是从零开始的...初始基础版的.vimrc有copy他们版本&#xff0c;在此基础上进行了各类配置。 先放个最终效果&#xff0c;以lammps in文件为例&#xff1a;

标签:从零开始  

相关问题

相关文章

热门文章

推荐文章

相关标签