我正在尝试使用lua脚本在启用SSL的服务器上检索页面.需要注意的是,服务器具有自签名证书.由受信任的CA颁发的证书没有问题.
local https = require("socket.http")
local resp = {}
local r, c, h, s = https.request{
url = "https://my-server:443/example.php",
sink = ltn12.sink.table(resp),
protocol = "tlsv1"
}
Run Code Online (Sandbox Code Playgroud)
服务器返回:
错误请求您的浏览器发送了此服务器无法理解的请求.原因:您正在向支持SSL的服务器端口说明HTTP.请使用HTTPS方案访问此URL.
在服务器端,该请求在Apache ssl_access.log中生成此条目
192.168.0.150 - - [27/Nov/2011:16:32:07 +0100] "GET /" 400 529 "-" "-"
Run Code Online (Sandbox Code Playgroud)
此外,tcpdump显示在SYN-ACK握手之后,没有SSL 257 Client Hello发送.使用我的浏览器或wget使用相同的URL工作正常.
我正在编写一个使用Lua套接字与http服务器通信的程序.我使用的API是"socket.http.request",我发现它是同步的.我的理解是,它等待它得到一些响应或超时.我的理解是否正确?如果是这样,我宁愿使用异步API.
我还发现了另一个API"socket.http.request_cb",它在处理请求时调用了一个回调函数.但是,它似乎不适用于此.(这个API在我正在使用的版本上不可用.)我在这里使用Lua 5.1和Lua socket 2.0.2.谁能让我知道哪个版本的Lua或Lua套接字有这个API?
我正在尝试编译我在GitHub上使用lua 5.2找到的luasocket 3.问题是,我不知道如何结合在一起使用.我是否需要编译为DLL然后引用代码中的某个地方,或者我应该从lua控制台调用它?Lualuasocketluasocketlua
无论是我过度还是失明.我想学习与Lua的网络,因此我必须安装socketlib,所以我可以轻松地要求它,但我不知道,我应该"需要"哪些文件.这个例子说:
local socket = require("socket")
Run Code Online (Sandbox Code Playgroud)
但正如我所说,我不知道我应该包含哪些文件,如果我使用socket.lua它不起作用我得到:No files found.
我从这里得到了lib:Lua套接字下载
或者,是否有另一种方法来安装套接字lib?
LuaSocket HTTP模块文档说可以在HTTP连接上设置超时:
可以设置以下常量来控制HTTP模块的默认行为:
PORT:用于连接的默认端口; PROXY:用于连接的默认代理; TIMEOUT:设置所有I/O操作的超时; USERAGENT:向服务器报告的默认用户代理. http://w3.impa.br/~diego/software/luasocket/http.htm
如何在lua脚本中设置这些常量?
当我在终端中运行我的代码时,我收到此错误/消息:
module 'socket.http' not found:
no field package.preload['socket.http']
no file '/usr/local/share/lua/5.2/socket/http.lua'
no file '/usr/local/share/lua/5.2/socket/http/init.lua'
no file '/usr/local/lib/lua/5.2/socket/http.lua'
no file '/usr/local/lib/lua/5.2/socket/http/init.lua'
no file './socket/http.lua'
no file '/usr/local/lib/lua/5.2/socket/http.so'
no file '/usr/local/lib/lua/5.2/loadall.so'
no file './socket/http.so'
no file '/usr/local/lib/lua/5.2/socket.so'
no file '/usr/local/lib/lua/5.2/loadall.so'
no file './socket.so'
Run Code Online (Sandbox Code Playgroud)
一些消息来源让我调查LuaSocket,但我仍然不知道该做什么或如何安装它.
我正在研究一个小的Lua应用程序(在Lua for Windows下,如果这很重要),它使用套接字与外界进行通信.(LuaSocket)
而我正试图并行提出几个请求.所以我认为LuaLanes是要走的路.(当然,如果有更好的解决方案,我会接受替代方案,但我不愿意为此处理协程.)
像这样的东西:
server = assert (socket.bind ('*', 1234))
client = server : accept ()
-- set id to some unique value
allClients [id] = client
theLane = lanes.gen ("", laneTest) ( id )
print (theLane [1])
Run Code Online (Sandbox Code Playgroud)
当laneTest函数的定义如下:
function laneTest (id)
local client = allClients [id]
print ('peer: ', client:getpeername())
end
Run Code Online (Sandbox Code Playgroud)
我的问题是在laneTest函数内部,当作为一个通道运行时,我收到这个可爱的错误信息:
尝试索引本地"客户端"(userdata值)
(从线client:getpeername())
所以..我不确定这里发生了什么?车道与插座不兼容,还是我做错了什么?
我想这可能是因为车道附带的版本和Lua的Windows是古(luaforwindows),不与插座的工作,但最新的版本可能?(车道2.0.4对比最近的3.xx)
我真的不知道怎么去更新我所拥有的Lanes版本,否则我现在就试过了,所以.我很感激任何建议,如果那是我可以前进的地方,或者有更明显的事情,我做错了.
编辑:我继续通过luarocks安装车道,并使用安装为摇滚的车道3.1.6-1也有同样的问题.
编辑2:试过这个(但仍然失败):
require ('socket')
require ('lanes')
local allClients = {}
function …Run Code Online (Sandbox Code Playgroud) 我按照可用的说明在我的windows xp(32位)系统中安装了luarocks
http://luarocks.org/en/Installation_instructions_for_Windows
从luarocks安装luasocket我在命令提示符下使用了命令"luarocks install luasocket".但结果却出现了错误:
**Warning: Failed searching manifest: Failed loading manifest: Failed fetching man
ifest for http://luarocks.org/repositories/rocks - Error fetching file: Failed d
ownloading http://luarocks.org/repositories/rocks/manifest
Error: No results matching query were found.**
Run Code Online (Sandbox Code Playgroud)
所以它无法找到luasocket.rock文件.我从链接下载了文件luasocket-2.0.2-5.src.rock:
http://luarocks.org/repositories/rocks/
现在我尝试使用命令luarocks install luarocks install"C:\ Documents and Settings\Ankur_Gupta37\Desktop\LuaRocks\2.1\lua\luarocks"安装此.rock文件
(我把luasocket-2.0.2-5.src.rock放在"C:\ Documents and Settings\Ankur_Gupta37\Desktop\LuaRocks\2.1\lua\luarocks\luasocket-2.0.2-5.src.rock"这个位置)
但最后又出现了一个错误:
**set INCLUDE=C:/Documents and Settings/Ankur_Gupta37/Desktop/LuaRocks/2.1/include
;%INCLUDE% &set LIB=C:/Documents and Settings/Ankur_Gupta37/Desktop/LuaRocks/2.1
;%LIB% &msbuild /p:"VCBuildAdditionalOptions= /useenv" luasocket.sln &mkdir mime
& mkdir socket &cp src/mime.dll mime/core.dll &cp src/socket.dll …Run Code Online (Sandbox Code Playgroud) 当我使用以下脚本时:
local smtp = require("socket.smtp")
local from = "from@host"
local rcpt = "rcpt@host"
local msg = {
headers = {
to = rcpt,
subject = "Hi"
},
body = "Hello"
}
smtp.send{from = from,rcpt = rcpt,source = smtp.message(msg)}
Run Code Online (Sandbox Code Playgroud)
我收到一条错误消息:lua entry thread aborted: runtime error: attempt to yield across C-call boundary.
我正在使用Lua 5.1 的最新luasocket安装,luarocks使用与LuaJIT 2.1编译的nginx.是什么导致此错误消息,我该如何解决?
我有一个使用 luasocket 的 udp 客户端,基本上是这样做的(有几个抽象层,但这就是那里发生的事情):
s=socket.udp()
s:setsockname("*",0)
s:setpeername(socket.dns.toip("example.com"),64299)
s:settimeout(0)
s:send(...)
s:settimeout(10)
msg,err=s:receive()
s:settimeout(0)
print(msg,err)
Run Code Online (Sandbox Code Playgroud)
虽然在服务器的调试输出中看到一切正常(ssh 到远程主机),但我在客户端中收到“超时”错误。
当使用客户端wireshark检查所有内容时,我看到客户端发送的数据包,以及来自服务器的响应数据包(正确的端口和所有内容),以及从我的客户端主机发送到服务器的ICMP“端口不可达”数据包,以响应这是(正确的)回应。
那里发生了什么事?我尝试了所有方法,包括将 iptables 重置为“接受所有内容”,但我的客户端仍然发送“端口无法访问”。
相关数据包是:
From To Len Description
192.168.2.100 95.143.172.171 UDP 61 Source port: 45025 Destination port: 64299
000e8f11e7000025229835a908004500002f4008400040112b6fc0a802645f8facabafe1fb2b001b28d794d2000ec8360100aa81a477616e74a3756964
95.143.172.171 192.168.2.100 UDP 60 Source port: 64299 Destination port: 45025
0025229835a9000e8f11e70008004500002b000040003911727b5f8facabc0a80264fb2bafe100172e8d94d2000e0ea10100a681a3756964ff000000
192.168.2.100 95.143.172.171 ICMP 85 Destination unreachable (Port unreachable)
000e8f11e7000025229835a9080045c00047061d00004001a492c0a802645f8facab0303cc6c000000004500002b000040003911727b5f8facabc0a80264fb2bafe100172e8d94d2000e0ea10100a681a3756964ff
Run Code Online (Sandbox Code Playgroud)
防火墙,以防万一它很重要(我认为这并不重要,因为 iptables 在发生这种情况时不会增加任何 INPUT 数据包计数器):
$ sudo iptables -S
-P INPUT DROP
-P FORWARD DROP
-P OUTPUT ACCEPT
-A INPUT -i lo …Run Code Online (Sandbox Code Playgroud)