C++ LibCurl 库的使用方法
LibCurl是一个开源的免费的多协议数据传输开源库,该框架具备跨平台性,开源免费,并提供了包括HTTP、FTP、SMTP、POP3等协议的功能,使用libcurl可以方便地进行网络数据传输操作,如发送HTTP请求、下载文件、发送电子邮件等。它被广泛应用于各种网络应用开发中,特别是涉及到数据传输的场景。
- 下载地址:https://curl.haxx.se/download.html
首先读者需要自行下载该库,如下笔者选择下载curl-8.0.1.zip这个源代码版本,读者可找到如下页面,并点击对应版本完成下载,当下载好以后读者可自行将其解压缩到任意目录下。

当读者解压缩后,可打开VS2013 开发人员命令提示并切换带该目录中的curl-8.0.1\winbuild目录,通过执行如下两条命令即可分别实现编译静态库或动态库,我们以静态库编译为主,执行如下命令读者可自行等待一段时间。
- 动态库: nmake /f Makefile.vc mode=dll VC=13 MACHINE=x86 DEBUG=no
- 静态库: nmake / f Makefile.vc mode = static VC = 13 ENABLE_IDN = no MACHINE = x86 DEBUG = no
这个库在编译通过后会自动生成文件到builds\libcurl-vc13-x86-release-static-ipv6-sspi-schannel目录内,读者可自行打开该目录,即可看到该目录内的头文件以及库目录文件,如下图所示;

读者可自行配置这个静态库,通常只需要配置include和lib文件即可,该库的使用很简单,首先我们需要调用curl_easy_init()函数对CURL对象进行初始化,接着通过调用curl_easy_setopt()并传入一个访问URL链接,当访问成功后则可调用curl_easy_perform()函数得到访问结果,这就是该库基本使用方法,如下代码。
#define CURL_STATICLIB
#define BUILDING_LIBCURL
#include <iostream>
#include "curl/curl.h"#pragma comment (lib,"libcurl_a.lib")
#pragma comment (lib,"wldap32.lib")
#pragma comment (lib,"ws2_32.lib")
#pragma comment (lib,"Crypt32.lib")using namespace std;int main(int argc, char *argv[])
{CURL *curl;CURLcode res;curl = curl_easy_init();if (curl){curl_easy_setopt(curl, CURLOPT_URL, "https://www.lyshark.com");res = curl_easy_perform(curl);curl_easy_cleanup(curl);}std::cout << "返回状态: " << res << std::endl;system("pause");return 0;
}
运行上述代码,读者可看到网站www.lyshark.com的源代码,如下图所示;

上述代码中的curl_easy_setopt()函数第二个参数可以使用多种类型的变量定义,我们可以通过传入不同的常量来定义请求头中的参数,例如当我们需要修改协议头时,可以使用CURLOPT_HTTPHEADER常量,并在其后第三个参数中传入该常量所对应的结构即可,这个结构体定义有许多类型,具体如下下表所示;
| 常量名称 | 描述 |
|---|---|
| CURLINFO_EFFECTIVE_URL | 最后一个有效的URL地址 |
| CURLINFO_HTTP_CODE | 最后一个收到的HTTP代码 |
| CURLINFO_FILETIME | 远程获取文档的时间,如果无法获取,则返回值为-1 |
| CURLINFO_TOTAL_TIME | 最后一次传输所消耗的时间 |
| CURLINFO_NAMELOOKUP_TIME | 名称解析所消耗的时间 |
| CURLINFO_CONNECT_TIME | 建立连接所消耗的时间 |
| CURLINFO_PRETRANSFER_TIME | 从建立连接到准备传输所使用的时间 |
| CURLINFO_STARTTRANSFER_TIME | 从建立连接到传输开始所使用的时间 |
| CURLINFO_REDIRECT_TIME | 在事务传输开始前重定向所使用的时间 |
| CURLINFO_SIZE_UPLOAD | 以字节为单位返回上传数据量的总值 |
| CURLINFO_SIZE_DOWNLOAD | 以字节为单位返回下载数据量的总值 |
| CURLINFO_SPEED_DOWNLOAD | 平均下载速度 |
| CURLINFO_SPEED_UPLOAD | 平均上传速度 |
| CURLINFO_HEADER_SIZE | header部分的大小 |
| CURLINFO_HEADER_OUT | 发送请求的字符串 |
| CURLINFO_REQUEST_SIZE | 在HTTP请求中有问题的请求的大小 |
| CURLINFO_SSL_VERIFYRESULT | 通过设置CURLOPT_SSL_VERIFYPEER返回的SSL证书验证请求的结果 |
| CURLINFO_CONTENT_LENGTH_DOWNLOAD | 从Content-Length: field中读取的下载内容长度 |
| CURLINFO_CONTENT_LENGTH_UPLOAD | 上传内容大小的说明 |
| CURLINFO_CONTENT_TYPE | 下载内容的Content-Type:值,NULL表示服务器没有发送有效的Content-Type:header |
如下案例是一个简单的GET请求封装,通过调用GetStatus()函数实现对特定页面发起请求的功能,其中curl_slist_append()用于增加新的请求头数据,在调用curl_easy_setopt()函数时,分别传入了CURLOPT_HTTPHEADER设置请求头,CURLOPT_WRITEFUNCTION设置回调,CURLINFO_PRIMARY_IP获取目标IP地址,CURLINFO_RESPONSE_CODE获取目标返回代码,此处的write_data()函数直接返回0则表示屏蔽所有的页面输出内容。
#define CURL_STATICLIB
#define BUILDING_LIBCURL
#include <iostream>
#include "curl/curl.h"#pragma comment (lib,"libcurl_a.lib")
#pragma comment (lib,"wldap32.lib")
#pragma comment (lib,"ws2_32.lib")
#pragma comment (lib,"Crypt32.lib")using namespace std;// 设置CURLOPT_WRITEFUNCTION回调函数,返回为空屏蔽输出
static size_t write_data(char *d, size_t n, size_t l, void *p)
{return 0;
}// 获取网站返回值
void GetStatus(char *UrlPage)
{CURLcode return_code;// 初始化模块return_code = curl_global_init(CURL_GLOBAL_WIN32);if (CURLE_OK != return_code){return;}// 初始化填充请求头struct curl_slist *headers = NULL;headers = curl_slist_append(headers, "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:76.0)");headers = curl_slist_append(headers, "Referer: https://www.lyshark.com");// 初始化请求库CURL *easy_handle = curl_easy_init();if (NULL != easy_handle){// CURLOPT_HTTPHEADER 自定义设置请求头curl_easy_setopt(easy_handle, CURLOPT_HTTPHEADER, headers);// CURLOPT_URL 自定义请求的网站curl_easy_setopt(easy_handle, CURLOPT_URL, UrlPage);// CURLOPT_WRITEFUNCTION 设置回调函数,屏蔽输出curl_easy_setopt(easy_handle, CURLOPT_WRITEFUNCTION, write_data);// 执行CURL访问网站return_code = curl_easy_perform(easy_handle);char *ipAddress = { 0 };// CURLINFO_PRIMARY_IP 获取目标IP信息return_code = curl_easy_getinfo(easy_handle, CURLINFO_PRIMARY_IP, &ipAddress);if ((CURLE_OK == return_code) && ipAddress){std::cout << "目标IP: " << ipAddress << std::endl;}long retcode = 0;// CURLINFO_RESPONSE_CODE 获取目标返回状态return_code = curl_easy_getinfo(easy_handle, CURLINFO_RESPONSE_CODE, &retcode);if ((CURLE_OK == return_code) && retcode){std::cout << "返回状态码: " << retcode << std::endl;}}curl_easy_cleanup(easy_handle);curl_global_cleanup();
}int main(int argc, char *argv[])
{GetStatus("https://www.lyshark.com");system("pause");return 0;
}
运行上述代码,则可以获取到www.lyshark.com目标主机的IP地址以及页面返回状态,如下图所示;

当然该库同样支持POST请求方式,在使用POST请求时我们可以通过CURLOPT_COOKIEFILE参数指定Cookie参数,通过CURLOPT_POSTFIELDS指定POST的数据集,而如果需要使用代理模式则可以通过CURLOPT_PROXY方式来指定代理地址,
#define CURL_STATICLIB
#define BUILDING_LIBCURL
#include <iostream>
#include "curl/curl.h"#pragma comment (lib,"libcurl_a.lib")
#pragma comment (lib,"wldap32.lib")
#pragma comment (lib,"ws2_32.lib")
#pragma comment (lib,"Crypt32.lib")using namespace std;bool SendPost(char *Url, char *Cookie, char *PostVal)
{CURL *curl;CURLcode res;// 初始化库curl = curl_easy_init();if (curl){// 设置请求头struct curl_slist *headers = NULL;headers = curl_slist_append(headers, "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:76.0)");headers = curl_slist_append(headers, "Referer: https://www.lyshark.com");// 设置请求头curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);// 指定URLcurl_easy_setopt(curl, CURLOPT_URL, Url);// 指定cookie参数curl_easy_setopt(curl, CURLOPT_COOKIEFILE, Cookie);// 指定post内容curl_easy_setopt(curl, CURLOPT_POSTFIELDS, PostVal);// 是否代理// curl_easy_setopt(curl, CURLOPT_PROXY, "10.99.60.201:8080");res = curl_easy_perform(curl);curl_easy_cleanup(curl);}return true;
}int main(int argc, char *argv[])
{// 传入网址 cookie 以及post参数SendPost("https://www.lyshark.com/post.php", "1e12sde342r2", "&logintype=uid&u=xieyan&psw=xxx86");system("pause");return 0;
}
该函数的调用需要有一个POST结构才可测试,此处由于我并没有指定接口所有返回了页面错误信息,如下图所示;

接着继续实现下载页面到本地的功能,该功能实现的原理是利用write_data回调函数,当页面数据被读入到内存时回调函数会被触发,在该回调函数的内部通过调用fwrite函数将ptr指针中的数据保存本地,实现这段代码如下所示;
#define CURL_STATICLIB
#define BUILDING_LIBCURL
#include <iostream>
#include "curl/curl.h"#pragma comment (lib,"libcurl_a.lib")
#pragma comment (lib,"wldap32.lib")
#pragma comment (lib,"ws2_32.lib")
#pragma comment (lib,"Crypt32.lib")using namespace std;FILE *fp;size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream)
{int written = fwrite(ptr, size, nmemb, (FILE *)fp);return written;
}BOOL GetUrl(char *URL, char *FileName)
{CURL *curl;curl_global_init(CURL_GLOBAL_ALL);curl = curl_easy_init();curl_easy_setopt(curl, CURLOPT_URL, URL);// 在屏幕打印请求连接过程和返回http数据curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);// 查找次数,防止查找太深curl_easy_setopt(curl, CURLOPT_MAXREDIRS, 1);// 设置连接超时curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 3);// 接收数据时超时设置curl_easy_setopt(curl, CURLOPT_TIMEOUT, 3);if ((fp = fopen(FileName, "w")) == NULL){curl_easy_cleanup(curl);return FALSE;}// CURLOPT_WRITEFUNCTION 将后继的动作交给write_data函数处理curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);curl_easy_perform(curl);curl_easy_cleanup(curl);return TRUE;
}int main(int argc, char *argv[])
{// 下载网页到本地GetUrl("https://www.lyshark.com", "./lyshark.html");system("pause");return 0;
}
当读者运行上述程序后,即可将www.lyshark.com网站页面源码,下载到本地当前目录下lyshark.html,输出效果如下图所示;

为了能解析参数,我们还是需要将页面源代码读入到内存中,要实现这个需求并不难,首先我们定义一个std::string容器,然后当有新数据产生时触发WriteCallback在该函数内,我们直接将数据拷贝到一个内存指针中,也就是存储到read_buffer内,并将该缓冲区返回给调用者即可,如下则是完整源代码。
#define CURL_STATICLIB
#define BUILDING_LIBCURL
#include <iostream>
#include <string>
#include "curl/curl.h"#pragma comment (lib,"libcurl_a.lib")
#pragma comment (lib,"wldap32.lib")
#pragma comment (lib,"ws2_32.lib")
#pragma comment (lib,"Crypt32.lib")using namespace std;// 存储回调函数
size_t WriteCallback(char *contents, size_t size, size_t nmemb, void *userp)
{((std::string*)userp)->append((char*)contents, size * nmemb);return size * nmemb;
}// 获取数据并放入string中.
std::string GetUrlPageOfString(std::string url)
{std::string read_buffer;CURL *curl;curl_global_init(CURL_GLOBAL_ALL);curl = curl_easy_init();if (curl){// 忽略证书检查curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);// 重定向curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);// URL路径curl_easy_setopt(curl, CURLOPT_URL, url);// 查找次数,防止查找太深curl_easy_setopt(curl, CURLOPT_MAXREDIRS, 1);// 连接超时curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 3);// 接收数据时超时设置curl_easy_setopt(curl, CURLOPT_TIMEOUT, 3);// 写入回调函数curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);curl_easy_setopt(curl, CURLOPT_WRITEDATA, &read_buffer);curl_easy_perform(curl);curl_easy_cleanup(curl);return read_buffer;}return "None";
}int main(int argc, char *argv[])
{std::string urls = GetUrlPageOfString("https://www.lyshark.com");std::cout << "接收长度: " << urls.length() << " bytes" << std::endl;system("pause");return 0;
}
如下图所示,则是运行后输出内存数据长度,当然我们也可以直接输出urls中的数据,也就是网页的源代码;

本文作者: 王瑞
本文链接: https://www.lyshark.com/post/6aa9753b.html
版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
相关文章:
C++ LibCurl 库的使用方法
LibCurl是一个开源的免费的多协议数据传输开源库,该框架具备跨平台性,开源免费,并提供了包括HTTP、FTP、SMTP、POP3等协议的功能,使用libcurl可以方便地进行网络数据传输操作,如发送HTTP请求、下载文件、发送电子邮件等…...
自然语言处理从入门到应用——LangChain:索引(Indexes)-[向量存储器(Vectorstores)]
分类目录:《自然语言处理从入门到应用》总目录 Vectorstores是构建索引的最重要组件之一。本文展示了与VectorStores相关的基本功能。在使用VectorStores时,创建要放入其中的向量是一个关键部分,通常通过嵌入来创建。 from langchain.embedd…...
【C++练习】普通方法+利用this 设置一个矩形类(Rectangle), 包含私有成员长(length)、 宽(width), 定义一下成员函数
题目 设置一个矩形类(Rectangle), 包含私有成员长(length)、 宽(width), 定义成员函数: void set_ len(int l); //设置长度 设置宽度void set_ wid(int w); 获取长度: int get len(); 获取宽度: int get _wid); 显示周长和面积: v…...
电子电路学习笔记之SA1117BH-1.2TR——LDO低压差线性稳压器
关于LDO调节器(Low Dropout Regulator)是一种电压稳压器件,常用于电子设备中,用于将高电压转换为稳定的低电压。它能够在输入电压和输出电压之间产生较小的差异电压,因此被称为"低压差稳压器"。 LDO调节器通…...
【LeetCode-面试经典150题-day7】
392.判断子序列 题意: 给定字符串 s 和 t ,判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是&quo…...
00-音视频-概述
有很多场合会使用的音视频,比如安防、视频闸机、影音播放器、视频通话,短视频等等。 从摄像头采集到用户观看,这中间涉及到了很多技术。 用户一般观看的高清视频1080P30帧。若按24位RGB对视频进行存储,一个60分钟视频所占空间 …...
SOFARPC(笔记)
文章目录 一、快速开始1.1 SOFARPC1.2 基于SOFABoot 二、注册中心三、通讯协议2.1 Bolt基本发布调用方式超时控制协议泛化调用序列化协议自定义线程池 2.2 RESTful基本使用 2.3 其他协议四、架构 附录 官方样例下载地址-sofa-boot-guides 可查看 SOFARPC 方式快速入门 一、快…...
无线上网连接及配置
目录 1. 无线上网连接及配置 1.1 无线路由器连接方式 编辑 1.2 无线路由器的基本配置 1.配置用户计算机上的IP地址 2.访问无线路由Web管理界面 1.3 WAN 口设置 1.动态 IP 2.静态 IP 1. 无线上网连接及配置 一小型公司共有20名员工。由于公司业务需要访问Internet&…...
Webpack减少打包数量和体积(Umi 3.*中)
在UMI 3.*中配置: export default defineConfig({chunks: [vendors, umi],chainWebpack: function (config: any, { webpack }: any) {config.plugin(chunkPlugin).use(webpack.optimize.LimitChunkCountPlugin, [{maxChunks: 5, // 必须大于或等于 1,此…...
python Crypto 包安装
经测试使用 pip install pycrypto安装会出现,如下所示错误: pip install pycrypto -i https://pypi.douban.com/simple/ Looking in indexes: https://pypi.douban.com/simple/ Collecting pycrypto Using cached https://pypi.doubanio.com/packages/…...
时序预测 | MATLAB实现SO-CNN-LSTM蛇群算法优化卷积长短期记忆神经网络时间序列预测
时序预测 | MATLAB实现SO-CNN-LSTM蛇群算法优化卷积长短期记忆神经网络时间序列预测 目录 时序预测 | MATLAB实现SO-CNN-LSTM蛇群算法优化卷积长短期记忆神经网络时间序列预测预测效果基本介绍程序设计学习总结参考资料 预测效果 基本介绍 时序预测 | MATLAB实现SO-CNN-LSTM蛇群…...
前端开发,怎么解决浏览器兼容性问题? - 易智编译EaseEditing
解决浏览器兼容性问题是前端开发中常见的挑战之一。不同的浏览器可能对网页元素的渲染和功能支持有所不同,因此需要采取一些策略来确保您的网页在不同浏览器上都能正常运行和呈现。以下是一些解决浏览器兼容性问题的方法和策略: 使用CSS Resetÿ…...
树莓派3B安装64位操作系统
树莓派3B安装Ubuntu MATE_树莓派3b 安装ubuntu_雨田大大的博客-CSDN博客https://blog.csdn.net/lsjackson13/article/details/92423694?utm_mediumdistribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-0-92423694-blog-80716098.235%5Ev38%5Ep…...
Mysql系列 - 第2天:详解mysql数据类型(重点)
这是mysql系列第2篇文章。 环境:mysql5.7.25,cmd命令中进行演示。 主要内容 介绍mysql中常用的数据类型 mysql类型和java类型对应关系 数据类型选择的一些建议 MySQL的数据类型 主要包括以下五大类 整数类型:bit、bool、tinyint、smal…...
Linux常用的运维命令
1.查看进程按内存从大到小排序 ps -e -o "%C:%p:%z:%a"|sort -k5 -nr2.查看磁盘和分区信息 # 查看挂接的分区状态mount | column -t# 查看所有分区 fdisk -l# 查看所有交换分区 swapon -s3.查看网络信息 ifconfig # 查看所有网络接口的属性iptables -L…...
【从零学习python 】50.面向对象编程中的多态应用
文章目录 多态场景代码实现多态总结 进阶案例 多态 面向对象的三大特性: 封装:这是定义类的准则,根据对象的特点,将行为和属性抽象出来,封装到一个类中。继承:这是设计类的技巧。父类与子类,主…...
实现Token刷新机制
问题场景: 开发的项目中,如果正在项目中编辑信息,编辑信息的时间的过程中token失效可能导致信息丢失怎么办? 一、解决方法 实现Token刷新机制:客户端定时刷新token,当用户的token即将过期时,可以向服务器…...
FlaUi输入账号密码
FlaUI是一个用于自动化Windows桌面应用程序的开源UI自动化库,通常用于自动化Windows应用程序的测试和操作。如果你想使用FlaUI来输入账号和密码,你需要编写一些C#或其他支持.NET的编程代码来实现这一目标。以下是一个使用FlaUI来输入账号和密码的简单示例…...
ModStartBlog v8.0.0 博客归档页面,部分组件升级
ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场拥有丰富的功能应用,支持后台一键快速安装,让开发者能快的实现业务功能开发。 系统完全开源,基于 Apache 2.0 开源协议。 功能特性 丰富的模块市场,后台一键快速安装会…...
使用 PyTorch 进行高效图像分割:第 4 部分
一、说明 在这个由 4 部分组成的系列中,我们将使用 PyTorch 中的深度学习技术从头开始逐步实现图像分割。本部分将重点介绍如何实现基于视觉转换器的图像分割模型。 图 1:使用视觉转换器模型架构运行图像分割的结果。 从上到下,输入图像、地面…...
(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
