Skip to content

Repository files navigation

socket

A cross platform socket library for lde.

Usage

lde add socket

Examples

TCP server and client

localsocket=require("socket")
-- Server: bind, accept one connection, echo backlocallistener=assert(socket.tcp.bind("127.0.0.1", 8080))
localclient=assert(listener:accept())
localmsg=assert(client:read(5)) -- read exactly 5 bytesclient:write("echo:" ..msg)
client:close()
listener:close()
-- Client: connect and exchange datalocalstream=assert(socket.tcp.connect("127.0.0.1", 8080))
stream:write("hello")
localreply=assert(stream:read(10))
stream:close()

TCP server using the incoming() iterator

localsocket=require("socket")
locallistener=assert(socket.tcp.bind("0.0.0.0", 8080))
forconninlistener:incoming() dolocaldata=assert(conn:read(1024))
conn:write(data) -- echoconn:close()
end

UDP send and receive

localsocket=require("socket")
-- Receiverlocalserver=assert(socket.udp.bind("127.0.0.1", 9000))
localdata, addr, port=assert(server:recvFrom())
server:sendTo("pong", addr, port)
server:close()
-- Sender (sendTo, no prior connect needed)localclient=assert(socket.udp.bind("127.0.0.1", 0))
client:sendTo("ping", "127.0.0.1", 9000)
localreply=assert(client:recvFrom())
client:close()
-- Sender (connect first, then send)localsock=assert(socket.udp.connect("127.0.0.1", 9000))
sock:send("ping")
sock:close()

Non-blocking sockets and polling

localsocket=require("socket")
-- Streams, listeners and udp sockets can be toggled between blocking and-- non-blocking mode.localstream=assert(socket.tcp.connect("127.0.0.1", 8080))
assert(stream:setNonBlocking(true))
-- socket.poll() returns the subset of handles that are ready to read-- (including peers that closed, so EOF never hangs a poller).locallistener=assert(socket.tcp.bind("0.0.0.0", 8081))
assert(listener:setNonBlocking(true))
whiletruedolocalready=assert(socket.poll({ listener, stream }, 1000))
for_, sockinipairs(ready) doifsock==listenerthenlocalconn=assert(listener:accept())
conn:setNonBlocking(true)
else-- readSome reads what is available without looping; it returns-- nil + "would block" when there is nothing buffered yet.localdata, err=stream:readSome(4096)
iferr=="would block" then-- spurious wakeup, keep pollingelseiferrthenstream:close()
elsestream:write(data)
endendendend

timeout is in milliseconds: socket.poll(handles, 0) only checks, and nil waits forever. Exact read/write calls assume blocking sockets; once a socket is non-blocking, use readSome/readSomeInto (and poll for writability separately if you push large payloads).

About

A cross platform socket library for LuaJIT.

Topics

Resources

Stars

2 stars

Watchers

0 watching

Forks

Contributors

Languages