Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 通过luajit调用winhttp_C_Lua_Winhttp_Luajit - Fatal编程技术网

C 通过luajit调用winhttp

C 通过luajit调用winhttp,c,lua,winhttp,luajit,C,Lua,Winhttp,Luajit,我正在尝试使用usingluajit执行一个简单的GET请求,但似乎被卡住了。我正在创建请求,但是当我尝试接收响应时,我什么也没有得到。我的代码可以在下面看到 local ffi = require("ffi") local log = require("log") local winhttp = ffi.load("winhttp") ffi.cdef[[ typedef void * HINTERNET; typedef unsigned int INTERNET_PORT; ty

我正在尝试使用usingluajit执行一个简单的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("Could not create session ", 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("Could not connect ", 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("Could not create request ", ffi.C.GetLastError()) return end local response = winhttp.WinHttpReceiveResponse(request, nil) log.debug(response) if not tonumber(response) then log.error("Could not receive response ", 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("No data available ", ffi.C.GetLastError()) return end end } 本地外国金融机构=要求(“外国金融机构”) 本地日志=需要(“日志”) 本地winhttp=ffi.load(“winhttp”) 外国金融机构[[ typedef void*HINTERNET; typedef无符号int INTERNET_端口; typedef const wchar_t*LPCWSTR; typedef无符号长双字; typedef无符号长DWORD_PTR; 类型定义DWORD*LPDWORD; typedef void*LPVOID; typedef int BOOL; 静态常量int INTERNET\u默认\u端口=0; 静态常量int INTERNET\u默认\u HTTP\u端口=80; 静态常量int INTERNET\u默认值\u HTTPS\u端口=443; 静态常量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 N服务器端口、DWORD DWORD保留); HINTERNET WinHttpOpenRequest(HINTERNET hConnect、LPCWSTR pwszVerb、LPCWSTR pwszObjectName、LPCWSTR pwszVersion、LPCWSTR PWSZReferer、LPCWSTR*PPWSZAcceptypes、DWORD dwFlags); BOOL WinHttpSendRequest(HINTERNET hRequest、LPCWSTR pwszHeaders、DWORD DWHEADERSENGTH、LPVOID lpOptional、DWORD DWORD dwOptionalLength、DWORD_PTR dwContext); BOOL WinHttpReceiveResponse(HINTERNET hRequest,LPVOID lpReserved); BOOL WinHttpQueryDataAvailable(HINTERNET hRequest、LPDWORD LPDWNumberOfBytes可用); DWORD GetLastError(无效); ]] 返回{ get=函数(url) 本地会话=winhttp.WinHttpOpen(L(“示例/1.0”),1,nil,nil,0) log.debug(会话) 如果不是,那么 log.error(“无法创建会话”,ffi.C.GetLastError()) 返回 结束 --www.google.com 本地连接=winhttp.WinHttpConnect(会话,L(“www.google.com”),winhttp.INTERNET\u默认\u端口,0) log.debug(连接) 如果没有连接,那么 log.error(“无法连接”,ffi.C.GetLastError()) 返回 结束 本地请求=winhttp.WinHttpOpenRequest(connect,L(“GET”),nil,nil,nil,nil,winhttp.winhttp\u FLAG\u SECURE) log.debug(请求) 如果没有要求,那么 log.error(“无法创建请求”,ffi.C.GetLastError()) 返回 结束 本地响应=winhttp.WinHttpReceiveResponse(请求,无) log.debug(响应) 如果不是tonumber(响应),则 log.error(“无法接收响应”,ffi.C.GetLastError()) 返回 结束 本地规模=外国金融机构新(“LPDWORD”) winhttp.WinHttpQueryDataAvailable(请求,大小) log.debug(大小) 如果不是TonNumber(大小)或不是TonNumber(大小[0]),则 log.error(“无可用数据”,ffi.C.GetLastError()) 返回 结束 结束 } 我在运行时获得的示例日志输出是

[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: No data available 183 [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 [错误Fri Jun 2 09:10:42 2017]lua\libs\http.lua:62:无可用数据183
我忽略了最重要的功能之一。我没有调用
WinHttpSendRequest

google使用重定向。可能需要打开它一些地方尝试了一堆URL(reddit,stackoverflow,bing)都有相同的结果。因此,我刚刚在
WinHttpReceiveResponse
之后记录了
GetLastError()
,并获得了
ERROR\u WINHTTP\u ERROR\u HANDLE\u STATE
。所以我想现在至少给了我一些东西。