使用luajit调用winhttp库
2017-6-2 13:21:43
收藏:0
阅读:153
评论:1
我正在尝试使用luajit和winhttp库做一个简单的GET请求,目前似乎卡住了。我创建了请求,但是当我尝试接收响应时什么也没有。下面是我写的代码:
local ffi = require("ffi")
local log = require("log")
local winhttp = ffi.load("winhttp")
ffi.cdef[[
typedef void * HINTERNET;
typedef unsigned int INTERNET_PORT;
typedef const wchar_t * LPCWSTR;
typedef unsigned long DWORD;
typedef unsigned long DWORD_PTR;
typedef DWORD * LPDWORD;
typedef void * LPVOID;
typedef int BOOL;
static const int INTERNET_DEFAULT_PORT = 0;
static const int INTERNET_DEFAULT_HTTP_PORT = 80;
static const int INTERNET_DEFAULT_HTTPS_PORT = 443;
static const int WINHTTP_FLAG_SECURE = 0x00800000;
HINTERNET WinHttpOpen(LPCWSTR pwszUserAgent, DWORD dwAccessType, LPCWSTR pwszProxyName, LPCWSTR pwszProxyBypass, DWORD dwFlags);
HINTERNET WinHttpConnect(HINTERNET hSession, LPCWSTR pswzServerName, INTERNET_PORT nServerPort, DWORD dwReserved);
HINTERNET WinHttpOpenRequest(HINTERNET hConnect, LPCWSTR pwszVerb, LPCWSTR pwszObjectName, LPCWSTR pwszVersion, LPCWSTR pwszReferrer, LPCWSTR *ppwszAcceptTypes, DWORD dwFlags);
BOOL WinHttpSendRequest(HINTERNET hRequest, LPCWSTR pwszHeaders, DWORD dwHeadersLength, LPVOID lpOptional, DWORD dwOptionalLength, DWORD dwTotalLength, DWORD_PTR dwContext);
BOOL WinHttpReceiveResponse(HINTERNET hRequest, LPVOID lpReserved);
BOOL WinHttpQueryDataAvailable(HINTERNET hRequest, LPDWORD lpdwNumberOfBytesAvailable);
DWORD GetLastError(void);
]]
return {
get = function(url)
local session = winhttp.WinHttpOpen(L("Example/1.0"), 1, nil, nil, 0)
log.debug(session)
if not session then
log.error("无法创建会话 ", ffi.C.GetLastError())
return
end
--www.google.com
local connect = winhttp.WinHttpConnect(session, L("www.google.com"), winhttp.INTERNET_DEFAULT_PORT, 0)
log.debug(connect)
if not connect then
log.error("无法连接 ", ffi.C.GetLastError())
return
end
local request = winhttp.WinHttpOpenRequest(connect, L("GET"), nil, nil, nil, nil, winhttp.WINHTTP_FLAG_SECURE)
log.debug(request)
if not request then
log.error("无法创建请求 ", ffi.C.GetLastError())
return
end
local response = winhttp.WinHttpReceiveResponse(request, nil)
log.debug(response)
if not tonumber(response) then
log.error("无法接收响应 ", ffi.C.GetLastError())
return
end
local size = ffi.new("LPDWORD")
winhttp.WinHttpQueryDataAvailable(request, size)
log.debug(size)
if not tonumber(size) or not tonumber(size[0]) then
log.error("没有可用数据 ", ffi.C.GetLastError())
return
end
end
}
运行时,我获得的样本日志输出如下:
[DEBUG Fri Jun 2 09:10:42 2017] lua\libs\http.lua:34: cdata: 0x005d16c8
[DEBUG Fri Jun 2 09:10:42 2017] lua\libs\http.lua:41: cdata: 0x0077ec60
[DEBUG Fri Jun 2 09:10:42 2017] lua\libs\http.lua:47: cdata: 0x005a2328
[DEBUG Fri Jun 2 09:10:42 2017] lua\libs\http.lua:53: -0
[DEBUG Fri Jun 2 09:10:42 2017] lua\libs\http.lua:60: cdata: NULL
[ERROR Fri Jun 2 09:10:42 2017] lua\libs\http.lua:62: 没有可用数据 183
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

我忽略了其中一个最重要的函数。我没有调用
WinHttpSendRequest。