-
Notifications
You must be signed in to change notification settings - Fork 0
sockets 1.6
A list of error codes from (7) errno.h exported to Lua.
Methods:
-
box.errno()- last errno -
box.errno.E*- error codes from(7) errno.h(for example,box.errno.EBUSY) -
box.errno.strerror(code)- returns string error description based on error code
box.socket.getaddrinfo(host, port[, timeout][, hints ])
Returns an array with hosts, e.g.:
{
{ host = '127.0.0.1', port = 8080, family = 'AF_INET', type = 'SOCK_STREAM', protocol = 'tcp' },
{ host = '::1', port = 8080, family = 'AF_INET6', type = 'SOCK_STREAM', protocol = 'tcp' },
...
}
Optional hints argument is a Lua table with one of several of the hints below:
family - protocol family (a string such as 'AF_INET', 'AF_UNIX', etc)
type - socket type (string, 'SOCK_STREAM', 'SOCK_DGRAM', etc)
protocol - protocol name (string, 'tcp', 'ip', etc)
flags - a table with flags (strings in AI_* family)
Any value of the returned array can be used to create a socket.
In case of error, returns n nil. Use box.errno() to find out
more about the occurred error.
s = box.socket(domain, type, protocol)
Domain, type, protocol - string constants with names identical to one in
man 2 socket and to the contents of /etc/protocols
Returns a socket object, or nil in case of error.
In case of error, an error code and a text description of the error are available with:
socket:errno() and socket:error()
Example:
local s = socket('AF_INET', 'SOCK_STREAM', 'tcp')
Error code and error message of the last error occurred on this socket.
A low level binding to man 2 connect, which tries to connect
to the given address .
host, port - must be an IPv4, IPv6 address or a UNIX path.
local s = box.socket('PF_INET', 'SOCK_STREAM', 'tcp')
if not s:sysconnect('127.0.0.1', 80) then
error("Can't connect to server '127.0.0.1:80': " .. s:error())
end
s:write("HEAD / HTTP/1.1\r\nHost: mail.ru\r\nConnection: close\r\n\r\n")
return s:readline({ "\r\n\r\n", "\n\n" })
A low level read. Issues man 2 read under the hood. Returns
a Lua string (possibly empty) with read data.
In case of error, returns nil. Can block the calling process
in case the socket is blocking.
local data = s:sysread(4096)
if data == nil then
error(s:error())
end
buf = buf .. data
A low level write. Calls man 2 write under the hood. Returns the number
of bytes written or nil in case of error.
Can block the calling process if the socket is blocking.
local sent = s:syswrite('Hello, world')
if sent == nil then
error(s:error())
end
Get, set or clear the non-blocking socket flag. Returns the current value of the flag.
Close the socket. Returns true in case of success or false in
case of error.
Shut down the reading or writing end of the socket, or both.
See man 2 shutdown. Returns true in case of success and false
in case of error.
how can be one of the following:
-
RorREADor0- close the reading end -
WorWRITEor1- close the wtiting end -
RWorREAD_WRITEor2- close both the reading and the writing end.
Bind a socket to a host/port pair. The host and port must not
require a domain name resolution, same as in :sysconnect.
Returns true on success and false on error.
Begins listening on a socket. See also man 2 listen.
Returns true on success and false on error.
Accepts an incoming connection. Returns a new socket or nil in
case of error. Can block the calling process unless the socket
is marked as non-blocking.
Note that the new socket inherits the blocking mode
from the acceptor socket on some operating system, and
does not inherits the mode on others, so it is a good
practice to set the mode explicitly on the accepted socket.
Set or clear socket flags (see man setsockopt and man getsockopt). Supports the following flags:
SO_ACCEPTCONN,
SO_BINDTODEVICE, SO_BROADCAST, SO_BSDCOMPAT, SO_DEBUG,
SO_DOMAIN, SO_ERROR, SO_DONTROUTE, SO_KEEPALIVE,
SO_MARK, SO_OOBINLINE, SO_PASSCRED, SO_PEERCRED,
SO_PRIORITY, SO_PROTOCOL, SO_RCVBUF, SO_RCVBUFFORCE,
SO_RCVLOWAT, SO_SNDLOWAT, SO_RCVTIMEO, SO_SNDTIMEO,
SO_REUSEADDR, SO_SNDBUF, SO_SNDBUFFORCE, SO_TIMESTAMP,
SO_TYPE.
Setting or clearing SO_LINGER is done with so:linger(active, timeout)
Block the calling fiber until the socket becomes readable or
the timeout expires.
Returns true if/when the socket has data available for reading, and
false in case of error or timeout.
Block the calling fiber until the socket becomes writable or
the timeout expires.
Returns true if/when the socket is available for reading, and
false in case of error or timeout.
Block the calling fiber until the socket becomes readable or writable or
the timeout expires.
Returns string R, W, RW, describing the state of the socket,
or nil in case of timeout.
A wrapper around s:sysread().
Reads data from the socket until one of the following
conditions is met:
- the number of bytes read is at least
len -
eofis read from the socket (sysreadreturns 0 bytes) - timeout is reached
- a read error occurred
Returns a string with data in cases of success or nil in case of error.
Notes:
- the data is read into an internal buffer,
s.rbuf - if there is data already in
s.rbufthis data is taken into account in a subsequent call tos:read()ands:readline()(but not ins:sysread()) -
s:sysread()bypassess.rbuf
A wrapper around s:sysread().
Read data from the socket until one of the following conditions is met:
- A string ending with one of the markers passed in
eolstable is read -
eofis read (sysread()returns 0 bytes) - timeout is reached
- length limit (passed in
len) is reached - error occurred
Returns a string with data in case of success and `nil in case of error.
Uses s.rbuf along with s:read().
A wrapper around s:syswrite().
Write str to the socket, untl one of the following
events occurs:
- str is fully written
- timeout is reached.
- an error occurred.
Returns true on success and false on error.
Receive or send a datagramm. See man 3 recv и man 3 send.
s:send() returns true on success and false on error.
s:recv() returns a string with a datagram on success and nil
in case of error.
function tcp_connect(host, port)
local ainfo =
box.socket.getaddrinfo(host, port, nil, { protocol = 'tcp' })
if ainfo == nil then
error( box.errno.strerror(box.errno()) )
end
for i, a in pairs(ainfo) do
local s = box.socket(a.family, a.type, a.protocol)
if s == nil then
error( box.errno.strerror(box.errno()) )
end
s:nonblock(true)
if s:sysconnect(a.host, a.port) then
return s
end
end
error("Can't connect to " .. host .. ":" .. port)
end
function http_request(host, port, request)
local s = tcp_connect(host, port)
s:write(request)
local header = s:readline(4096, { "\r\n\r\n", "\n\n" })
header = parse_header(header)
local body = s:read(header['content-length'])
return body, header
end
local ms = box.socket('PF_INET', 'SOCK_STREAM', 'tcp')
ms:nonblock(true)
ms:bind('127.0.0.1', 8080)
ms:listen(128)
while ms:readable() do
local client = ms:accept()
client:nonblock(true)
box.fiber.wrap(
function(client)
local request = client:readline(512, { "\n" })
client:shutdown('READ')
client:write(request)
client:close()
end,
client)
end
ms:close()
local socket = require('socket')
local fiber = require('fiber')
local ms = socket('PF_INET', 'SOCK_STREAM', 'tcp')
ms:setsockopt('SOL_SOCKET', 'SO_REUSEADDR', true)
ms:nonblock(true)
ms:bind('127.0.0.1', 8080)
ms:listen(128)
while ms:readable() do
local client = ms:accept()
client:nonblock(true)
fiber.create(
function(client)
client:readable()
local request = client:recv()
client:shutdown('READ')
client:write(request)
client:close()
end,
client)
end
ms:close()socket.tcp_connect()
local socket = box.socket.tcp_connect(host, port, timeout)
This functions resolves the host and port, and establishes
a connection.
If host contains string unix/, then port must contain a path to a
UNIX-socket.
Architecture Specifications
- Server architecture
- Feature specifications
- What's in a good specification
- Functional indexes
- Space _index structure
- R tree index quick start and usage
- LuaJIT
- Vinyl
- SQL
- Testing
- Performance
How To ...?
- ... add new fuzzers
- ... build RPM or Deb package using packpack
- ... calculate memory size
- ... debug core dump of stripped tarantool
- ... debug core from different OS
- ... debug Lua state with GDB
- ... generate new bootstrap snapshot
- ... use Address Sanitizer
- ... collect a coredump
Lua modules
Useful links