# HG changeset patch # User Nobuyasu Oshiro # Date 1394299837 -32400 # Node ID ddac6199c51a7ad36715c93b1f3a3ba053176093 # Parent b5ce185f154b6f24eb64e57faa6792ce98f274e7 Added echo_server_select.lua diff -r b5ce185f154b -r ddac6199c51a coroutine/echo_server/echo_server_select.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/coroutine/echo_server/echo_server_select.lua Sun Mar 09 02:30:37 2014 +0900 @@ -0,0 +1,50 @@ +local socket = require("socket") + +response = { ["end"] = function(sock) sock:close() end} + +function acceptfunction(server, time) + acceptco = coroutine.create( + function (serversocket, time) + time = time or 0.1 + serversocket:settimeout(time) + coroutine.yield(serversocket:accept()) + end) + return coroutine.resume(acceptco, server, time) +end +function echofunction(socketarray) + echoco = coroutine.create( + function(socketarray, time) + time = time or 0.1 + if #socketarray == 0 then + socket.select(nil, nil, time) + coroutine.yield() + end + local canread = socket.select(socketarray, socketarray, time) + for _,c in ipairs(canread) do + local mess, err = c:receive() + if response[mess] then + response[mess](c) + else + print(mess) + c:send(mess.."\n") + end + end + coroutine.yield() + end ) + return coroutine.resume(echoco, socketarray, 0.1) +end + +local socketarray = {} +local server = socket.bind("127.0.0.1", "8080") +assert(server) +while true do + local flag, socket = acceptfunction(server, 0.1) + if socket then + table.insert(socketarray, socket) + end + echofunction(socketarray) +end + + + +