123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333 |
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
- "http://www.w3.org/TR/html4/strict.dtd">
- <html>
- <head>
- <meta name="description" content="LuaSocket: Introduction to the core">
- <meta name="keywords" content="Lua, LuaSocket, TCP, UDP, Network,
- Library, Support">
- <title>LuaSocket: Introduction to the core</title>
- <link rel="stylesheet" href="reference.css" type="text/css">
- </head>
- <body>
- <!-- header +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
- <div class=header>
- <hr>
- <center>
- <table summary="LuaSocket logo">
- <tr><td align=center><a href="http://www.lua.org">
- <img width=128 height=128 border=0 alt="LuaSocket" src="luasocket.png">
- </a></td></tr>
- <tr><td align=center valign=top>Network support for the Lua language
- </td></tr>
- </table>
- <p class=bar>
- <a href="index.html">home</a> ·
- <a href="index.html#download">download</a> ·
- <a href="installation.html">installation</a> ·
- <a href="introduction.html">introduction</a> ·
- <a href="reference.html">reference</a>
- </p>
- </center>
- <hr>
- </div>
- <!-- introduction +++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
- <h2>Introduction</h2>
- <p>
- LuaSocket is a <a href="http://www.lua.org">Lua</a> extension library
- that is composed by two parts: a C core that provides support for the TCP
- and UDP transport layers, and a set of Lua modules that add support for
- the SMTP (sending e-mails), HTTP (WWW access) and FTP (uploading and
- downloading files) protocols and other functionality commonly needed by
- applications that deal with the Internet. This introduction is about the C
- core.
- </p>
- <p>
- Communication in LuaSocket is performed via I/O objects. These can
- represent different network domains. Currently, support is provided for TCP
- and UDP, but nothing prevents other developers from implementing SSL, Local
- Domain, Pipes, File Descriptors etc. I/O objects provide a standard
- interface to I/O across different domains and operating systems.
- </p>
- <p>
- The API design had two goals in mind. First, users
- experienced with the C API to sockets should feel comfortable using LuaSocket.
- Second, the simplicity and the feel of the Lua language should be
- preserved. To achieve these goals, the LuaSocket API keeps the function names and semantics the C API whenever possible, but their usage in Lua has been greatly simplified.
- </p>
- <p>
- One of the simplifications is the receive pattern capability.
- Applications can read data from stream domains (such as TCP)
- line by line, block by block, or until the connection is closed.
- All I/O reads are buffered and the performance differences between
- different receive patterns are negligible.
- </p>
- <p>
- Another advantage is the flexible timeout control
- mechanism. As in C, all I/O operations are blocking by default. For
- example, the <a href=tcp.html#send><tt>send</tt></a>,
- <a href=tcp.html#receive><tt>receive</tt></a> and
- <a href=tcp.html#accept><tt>accept</tt></a> methods
- of the TCP domain will block the caller application until
- the operation is completed (if ever!). However, with a call to the
- <a href=tcp.html#settimeout><tt>settimeout</tt></a>
- method, an application can specify upper limits on
- the time it can be blocked by LuaSocket (the "<tt>total</tt>" timeout), on
- the time LuaSocket can internally be blocked by any OS call (the
- "<tt>block</tt>" timeout) or a combination of the two. Each LuaSocket
- call might perform several OS calls, so that the two timeout values are
- <em>not</em> equivalent.
- </p>
- <p>
- Finally, the host name resolution is transparent, meaning that most
- functions and methods accept both IP addresses and host names. In case a
- host name is given, the library queries the system's resolver and
- tries the main IP address returned. Note that direct use of IP addresses
- is more efficient, of course. The
- <a href=dns.html#toip><tt>toip</tt></a>
- and <a href=dns.html#tohostname><tt>tohostname</tt></a>
- functions from the DNS module are provided to convert between host names and IP addresses.
- </p>
- <p>
- Together, these changes make network programming in LuaSocket much simpler
- than it is in C, as the following sections will show.
- </p>
- <!-- tcp ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
- <h3 id=tcp>TCP</h3>
- <p>
- TCP (Transfer Control Protocol) is reliable stream protocol. In other
- words, applications communicating through TCP can send and receive data as
- an error free stream of bytes. Data is split in one end and
- reassembled transparently on the other end. There are no boundaries in
- the data transfers. The library allows users to read data from the
- sockets in several different granularities: patterns are available for
- lines, arbitrary sized blocks or "read up to connection closed", all with
- good performance.
- </p>
- <p>
- The library distinguishes three types of TCP sockets: <em>master</em>,
- <em>client</em> and <em>server</em> sockets.
- </p>
- <p>
- Master sockets are newly created TCP sockets returned by the function
- <a href=tcp.html#tcp><tt>socket.tcp</tt></a>. A master socket is
- transformed into a server socket
- after it is associated with a <em>local</em> address by a call to the
- <a href=tcp.html#bind><tt>bind</tt></a> method followed by a call to the
- <a href=tcp.html#listen><tt>listen</tt></a>. Conversely, a master socket
- can be changed into a client socket with the method
- <a href=tcp.html#connect><tt>connect</tt></a>,
- which associates it with a <em>remote</em> address.
- </p>
- <p>
- On server sockets, applications can use the
- <a href=tcp.html#accept><tt>accept</tt></a> method
- to wait for a client connection. Once a connection is established, a
- client socket object is returned representing this connection. The
- other methods available for server socket objects are
- <a href=tcp.html#getsockname><tt>getsockname</tt></a>,
- <a href=tcp.html#setoption><tt>setoption</tt></a>,
- <a href=tcp.html#settimeout><tt>settimeout</tt></a>, and
- <a href=tcp.html#close><tt>close</tt></a>.
- </p>
- <p>
- Client sockets are used to exchange data between two applications over
- the Internet. Applications can call the methods
- <a href=tcp.html#send><tt>send</tt></a> and
- <a href=tcp.html#receive><tt>receive</tt></a>
- to send and receive data. The other methods
- available for client socket objects are
- <a href=tcp.html#getsockname><tt>getsockname</tt></a>,
- <a href=tcp.html#getpeername><tt>getpeername</tt></a>,
- <a href=tcp.html#setoption><tt>setoption</tt></a>,
- <a href=tcp.html#settimeout><tt>settimeout</tt></a>,
- <a href=tcp.html#shutdown><tt>shutdown</tt></a>, and
- <a href=tcp.html#close><tt>close</tt></a>.
- </p>
- <p>
- Example:
- </p>
- <blockquote>
- <p>
- A simple echo server, using LuaSocket. The program binds to an ephemeral
- port (one that is chosen by the operating system) on the local host and
- awaits client connections on that port. When a connection is established,
- the program reads a line from the remote end and sends it back, closing
- the connection immediately. You can test it using the telnet
- program.
- </p>
- <pre class=example>
- -- load namespace
- local socket = require("socket")
- -- create a TCP socket and bind it to the local host, at any port
- local server = assert(socket.bind("*", 0))
- -- find out which port the OS chose for us
- local ip, port = server:getsockname()
- -- print a message informing what's up
- print("Please telnet to localhost on port " .. port)
- print("After connecting, you have 10s to enter a line to be echoed")
- -- loop forever waiting for clients
- while 1 do
- -- wait for a connection from any client
- local client = server:accept()
- -- make sure we don't block waiting for this client's line
- client:settimeout(10)
- -- receive the line
- local line, err = client:receive()
- -- if there was no error, send it back to the client
- if not err then client:send(line .. "\n") end
- -- done with client, close the object
- client:close()
- end
- </pre>
- </blockquote>
- <!-- udp ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
- <h3 id=udp>UDP</h3>
- <p>
- UDP (User Datagram Protocol) is a non-reliable datagram protocol. In
- other words, applications communicating through UDP send and receive
- data as independent blocks, which are not guaranteed to reach the other
- end. Even when they do reach the other end, they are not guaranteed to be
- error free. Data transfers are atomic, one datagram at a time. Reading
- only part of a datagram discards the rest, so that the following read
- operation will act on the next datagram. The advantages are in
- simplicity (no connection setup) and performance (no error checking or
- error correction).
- </p>
- <p>
- Note that although no guarantees are made, these days
- networks are so good that, under normal circumstances, few errors
- happen in practice.
- </p>
- <p>
- An UDP socket object is created by the
- <a href=udp.html#udp><tt>socket.udp</tt></a> function. UDP
- sockets do not need to be connected before use. The method
- <a href=udp.html#sendto><tt>sendto</tt></a>
- can be used immediately after creation to
- send a datagram to IP address and port. Host names are not allowed
- because performing name resolution for each packet would be forbiddingly
- slow. Methods
- <a href=udp.html#receive><tt>receive</tt></a> and
- <a href=udp.html#receivefrom><tt>receivefrom</tt></a>
- can be used to retrieve datagrams, the latter returning the IP and port of
- the sender as extra return values (thus being slightly less
- efficient).
- </p>
- <p>
- When communication is performed repeatedly with a single peer, an
- application should call the
- <a href=udp.html#setpeername><tt>setpeername</tt></a> method to specify a
- permanent partner. Methods
- <a href=udp.html#sendto><tt>sendto</tt></a> and
- <a href=udp.html#receivefrom><tt>receivefrom</tt></a>
- can no longer be used, but the method
- <a href=udp.html#send><tt>send</tt></a> can be used to send data
- directly to the peer, and the method
- <a href=udp.html#receive><tt>receive</tt></a>
- will only return datagrams originating
- from that peer. There is about 30% performance gain due to this practice.
- </p>
- <p>
- To associate an UDP socket with a local address, an application calls the
- <a href=udp.html#setsockname><tt>setsockname</tt></a>
- method <em>before</em> sending any datagrams. Otherwise, the socket is
- automatically bound to an ephemeral address before the first data
- transmission and once bound the local address cannot be changed.
- The other methods available for UDP sockets are
- <a href=udp.html#getpeername><tt>getpeername</tt></a>,
- <a href=udp.html#getsockname><tt>getsockname</tt></a>,
- <a href=udp.html#settimeout><tt>settimeout</tt></a>,
- <a href=udp.html#setoption><tt>setoption</tt></a> and
- <a href=udp.html#close><tt>close</tt></a>.
- </p>
- <p>
- Example:
- </p>
- <blockquote>
- <p>
- A simple daytime client, using LuaSocket. The program connects to a remote
- server and tries to retrieve the daytime, printing the answer it got or an
- error message.
- </p>
- <pre class=example>
- -- change here to the host an port you want to contact
- local host, port = "localhost", 13
- -- load namespace
- local socket = require("socket")
- -- convert host name to ip address
- local ip = assert(socket.dns.toip(host))
- -- create a new UDP object
- local udp = assert(socket.udp())
- -- contact daytime host
- assert(udp:sendto("anything", ip, port))
- -- retrieve the answer and print results
- io.write(assert(udp:receive()))
- </pre>
- </blockquote>
- <!-- More +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
- <h3 id=more>Support modules</h3>
- <p> Although not covered in the introduction, LuaSocket offers
- much more than TCP and UDP functionality. As the library
- evolved, support for <a href=http.html>HTTP</a>, <a href=ftp.html>FTP</a>,
- and <a href=smtp.html>SMTP</a> were built on top of these. These modules
- and many others are covered by the <a href=reference.html>reference manual</a>.
- </p>
- <!-- footer +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
- <div class=footer>
- <hr>
- <center>
- <p class=bar>
- <a href="index.html">home</a> ·
- <a href="index.html#down">download</a> ·
- <a href="installation.html">installation</a> ·
- <a href="introduction.html">introduction</a> ·
- <a href="reference.html">reference</a>
- </p>
- <p>
- <small>
- Last modified by Diego Nehab on <br>
- Thu Apr 20 00:25:36 EDT 2006
- </small>
- </p>
- </center>
- </div>
- </body>
- </html>
|