Использование bind() для создания сервера с Lua Socket

Работая с LuaSocket, этот код работает:

local socket = require'socket'
local server = socket.bind('*',51423)
local client = server:accept()

но этот код не работает:

local socket = require 'socket'
local server = socket.tcp()
server:bind('*',51423)
local client = server:accept()    
--> lua: /tmp/server.lua:4: calling 'accept' on bad self (tcp{server} expected, got userdata)

Тем не менее, документация по TCP bind подразумевает, что последний должен работать, заявляя:

"Примечание: функция socket.bind доступна и является ярлыком для создания серверных сокетов".

Как я могу преобразовать общий "главный" объект в сервер?


Мотивация для этого - желание добавить тайм-аут на саму операцию связывания:

local socket = require'socket'
local server = socket.tcp()
server:settimeout(2/1000) -- Only wait 2ms when attempting to bind
server:bind('*',51423)

1 ответ

Решение

Ответ вверху той же страницы документации (упс):

"Главный объект может быть преобразован в сервер… методом listen (после звонка bind )"

Казалось бы, что s = socket.bind(…) на самом деле эквивалентно:

s = socket.tcp()
s:bind(…)
s:listen(32)

Я не уверен, почему они разделены на две функции, но изменяя код, чтобы добавить listen() заставляет это работать:

local socket = require 'socket'
local server = socket.tcp()
server:bind('*',51423)
server:listen(32)
local client = server:accept()    
Другие вопросы по тегам