6

次のスクリプトを使用すると:

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)}

エラー メッセージが表示されます: lua entry thread aborted: runtime error: attempt to yield across C-call boundary

LuaJIT 2.1でコンパイルされたnginxを使用して、Lua 5.1でluasocketインストールされた最新のものを使用しています。luarocksこのエラー メッセージの原因と修正方法を教えてください。

4

3 に答える 3

4

smtp.sendsocket.protect内部エラーを処理するためにLuaSocket の関数を使用します。この関数は C で実装されており、現在のリリースでは譲歩を許可していません (git HEAD のバージョンでは、Lua 5.2+ で譲歩が許可されています。ここでの議論を参照してください)。どうやらその中で誰かが屈服しようとしているようだ。LuaSocketetc/dispatch.luaパッケージ (git HEAD バージョンを使用することをお勧めします) には、すべての Lua バージョンで生成できるようにするための代替関数があります (追加の一時コルーチンを犠牲にして)。socket.protect次のように、C 関数をその Lua 関数に置き換えることができます。

local socket = require("socket")
local base = _G
-- paste modified socket.protect function here

-- continue with your own code:
local smtp = require("socket.smtp")
-- ...
于 2015-05-14T06:53:20.023 に答える