Использование 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()