设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 3102|回复: 9
打印 上一主题 下一主题

[通用发布] 异步可并发HTTP通信库(更新:可获取下载进度、取消操作)

[复制链接]

Lv3.寻梦者

梦石
0
星屑
1803
在线时间
133 小时
注册时间
2013-10-6
帖子
193
跳转到指定楼层
1
发表于 2015-2-23 23:13:36 | 显示全部楼层 |只看大图 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 不死鸟之翼 于 2015-5-17 12:39 编辑

当前版本:Version 0.2 (26KB)
https://azurefx.name/article/win ... %bf%a1%e5%ba%93dll/

这个动态链接库是为方便RGSS中进行常见HTTP通信而设计的,支持多连接并发。一共导出了6个函数。
CPP 代码复制下载
  1. DWORD WINAPI Create(LPCSTR server,LPCSTR action,LPCSTR method,LPCSTR data);
  2. DWORD WINAPI CreateEx(LPCSTR server,LPCSTR action,LPCSTR method,LPCSTR data,LPCSTR ctype,LPCSTR ua);
  3. INT WINAPI Query(DWORD token);
  4. INT WINAPI QueryEx(DWORD token,LPDWORD bytesTotal,LPDWORD bytesLoaded);
  5. INT WINAPI Retrieve(DWORD token,LPVOID buffer);
  6. BOOL WINAPI Close(DWORD token);

Create
开始一个HTTP请求。server为主机名,action为请求的资源,method为请求类型,data为附加数据。
函数会返回一个token代表这个请求,请保存以便后续使用。
例如Create(“www.baidu.com”,”s?wd=Hello,World!”,”GET”,””);
更多示例请参见另一篇文章

CreateEx
其他参数同Create。ctype为HTTP请求头中的Content-type,ua为浏览器标识。

Query
查询指定请求的状态。返回值可能如下:
INVALID=0
SUCCESS=1
FAILURE=2
PENDING=3
PROGRESS=4
INVALID代表无效的token,SUCCESS代表成功,FAILURE代表失败,PENDING代表请求等待回应,PROGRESS表示正在下载数据。

QueryEx
其他参数同Query。bytesTotal和bytesLoaded分别为接收总大小和已下载大小的变量指针。若无法获取总大小,bytesTotal的值为0xFFFFFFFF。

Retrieve
获取返回的数据。buffer为接收数据的缓冲区。
仅当请求状态为SUCCESS时调用这个函数。如果buffer为0则返回缓冲区所需的长度。
返回值为已接收的数据长度。

Close
关闭一个请求,释放资源。一个请求完成时务必调用这个函数。
返回值为零表示失败,非零表示成功。

所有函数均为__stdcall调用约定。
类型注释:
DWORD 32位无符号整数(l)
INT 32位整数(i)
BOOL 32位整数(i)
LPCSTR C风格字符串的指针(p)
LPDWORD 32位无符号整数的指针(p)
LPVOID 缓冲区指针(p)

点评

不知道是不是我的使用方式不对,不过CreateEx貌似不太行==  发表于 2015-3-18 01:16

评分

参与人数 1星屑 +140 收起 理由
喵呜喵5 + 140 精品文章

查看全部评分

Lv3.寻梦者

梦石
0
星屑
1803
在线时间
133 小时
注册时间
2013-10-6
帖子
193
2
 楼主| 发表于 2015-2-23 23:19:53 | 显示全部楼层
本帖最后由 不死鸟之翼 于 2015-2-25 15:50 编辑

【注意】0.2版本的status状态有变动,使用0.1版本配套脚本的同学请留意下载中的状态为PROGRESS而不是PENDING
如果是多连接并发,请保管好token。
我亲测开10个连接同时下载WinRAR的安装程序,没问题
然后 @kuerlulu 求食用姿势
←你看到一只经常潜水的萌新。
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1803
在线时间
133 小时
注册时间
2013-10-6
帖子
193
3
 楼主| 发表于 2015-2-24 10:55:09 | 显示全部楼层
赛露休斯 发表于 2015-2-24 08:12
点赞!很迅速嘛~初步测试了下正常获取网页信息
用这个来实时收发消息或许能够制作网游呢。。。 ...

网游的话还是应该直接使用TCP长连接比较好。这个更适合一次性提交数据,例如制作网络排行榜功能。
←你看到一只经常潜水的萌新。
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1803
在线时间
133 小时
注册时间
2013-10-6
帖子
193
4
 楼主| 发表于 2015-2-24 15:39:12 手机端发表。 | 显示全部楼层
kuerlulu 发表于 2015-2-24 15:04
发一个我刚写的Http#用之前先把上一个exe版本的Http删掉【本人的水平拙劣,代码风格奇特,恐不符大众口味, ...

你直接Win32 API的话至少三个HINTERNET句柄,都要手动Close掉……总之资源释放是好习惯,推荐扔到析构函数里一劳永逸。实际上FreeLibrary的时候DllMain里面会进行一次大清理,操作系统还会清理一边,所以也就是在运行期间泄露一点内存而已)雾,取决于你下载了多大的文件
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1803
在线时间
133 小时
注册时间
2013-10-6
帖子
193
5
 楼主| 发表于 2015-2-25 15:53:07 | 显示全部楼层
更新后可以获取下载进度了,也可以中断操作
@kuerlulu 你的下载器可以有进度条了:)
←你看到一只经常潜水的萌新。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-5-6 16:33

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表