aboutsummaryrefslogtreecommitdiff
path: root/doc/socket.html
blob: eccc6769ef0832beec10b9a9049381b1ecd774b0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" 
    "http://www.w3.org/TR/html4/strict.dtd">
<html>

<head>
<title>LuaSocket: Network support for the Lua language</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 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="home.html">home</a> &middot;
<a href="home.html#download">download</a> &middot;
<a href="introduction.html">introduction</a> &middot;
<a href="reference.html">reference</a> 
</p>
</center>
<hr>
</div>

<!-- socket +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->

<h2 id=socket>The socket namespace</h2> 

<p>
The <tt>socket</tt> namespace contains the core functionality of LuaSocket. 
</p>

<!-- debug ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->

<p class=name id=debug> 
socket.<b>DEBUG</b>
</p>

<p class=description>
This constant is set to <tt><b>true</b></tt> if the library was compiled
with debug support.
</p>


<!-- protect +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->

<p class=name id=protect> 
socket.<b>protect(</b>func<b>)</b>
</p>

<p class=description>
Converts a function that throws exceptions into a safe function.
</p>

<p class=parameters>
<tt>Funct</tt> is a function that calls 
<a href=#try><tt>try</tt></a> to throw exceptions. 
</p>

<p class=return>
Returns an equivalent function that instead of throwing exceptions,
returns <tt><b>nil</b></tt> followed by an error message. 
</p>

<!-- select +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->

<p class=name id=select> 
socket.<b>select(</b>recvt, sendt [, timeout]<b>)</b>
</p>

<p class=description>
Waits for a number of sockets to change status. 
</p>

<p class=parameters>
<tt>Recvt</tt> is an array with the sockets to test for characters
available for reading. Sockets in the <tt>sendt</tt> array are watched to
see if it is OK to immediately write on them.  <tt>Timeout</tt> is the
maximum amount of time (in seconds) to wait for a change in status.  A
<tt><b>nil</b></tt>, negative or omitted <tt>timeout</tt> value allows the
function to block indefinitely. <tt>Recvt</tt> and <tt>sendt</tt> can also
be empty tables or <tt><b>nil</b></tt>. Non-socket values in the arrays
will be silently ignored.
</p>

<p class=return> The function returns a table with the sockets ready for
reading, a table with the sockets ready for writing and an error message.
The error message is "<tt>timeout</tt>" if a timeout condition was met and
<tt><b>nil</b></tt> otherwise.  The returned tables are associative, to
simplify the test if a specific socket has changed status.  
</p>

<p class=note>
<b>Important note</b>: a known bug in WinSock causes <tt>select</tt> to fail 
on non-blocking TCP sockets. The function may return a socket as
writable even though the socket is <em>not</em> ready for sending.
</p>

<p class=note>
<b>Another important note</b>: calling select with a server socket in the receive
parameter before a call to accept does <em>not</em> guarantee
<a href=tcp.html#accept><tt>accept</tt></a> will return immediately. 
Use the <a href=tcp.html#settimeout><tt>settimeout</tt></a> 
method or <tt>accept</tt> might block forever.  
</p>

<p class=note>
Interesting note: as mentioned in some manuals, calling select with both
sets empty and a non-null timeout is a fairly portable way to sleep with
sub-second precision.
</p>


<!-- sink ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->

<p class=name id=sink> 
socket.<b>sink(</b>mode, socket<b>)</b>
</p>

<p class=description>
Creates an 
<a href="http://lua-users.org/wiki/FiltersSourcesAndSinks">LTN12</a>
sink from a stream socket object. 
</p>

<p class=parameters>
<tt>Mode</tt> defines the behaviour of the sink. The following
options are available:
</p>
<ul>
<li> <tt>"http-chunked"</tt>: sends data through socket after applying the
<em>chunked transfer coding</em>, closing the socket when done;
<li> <tt>"close-when-done"</tt>: sends all received data through the
socket, closing the socket when done; 
<li> <tt>"keep-open"</tt>: sends all received data through the
socket, leaving it open when done. 
</ul>
<p>
<tt>Socket</tt> is the stream socket object used to send the data. 
</p>

<p class=return>
The function returns a sink with the appropriate behavior. 
</p>

<!-- source +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->

<p class=name id=source> 
socket.<b>source(</b>mode, socket [, length]<b>)</b>
</p>

<p class=description>
Creates an 
<a href="http://lua-users.org/wiki/FiltersSourcesAndSinks">LTN12</a>
source from a stream socket object. 
</p>

<p class=parameters>
<tt>Mode</tt> defines the behaviour of the source. The following
options are available:
</p>
<ul>
<li> <tt>"http-chunked"</tt>: receives data from socket and removes the
<em>chunked transfer coding</em> before returning the data;
<li> <tt>"by-length"</tt>: receives a fixed number of bytes from the
socket. This mode requires the extra argument <tt>length</tt>; 
<li> <tt>"until-closed"</tt>: receives data from a socket until the other
side closes the connection. 
</ul>
<p>
<tt>Socket</tt> is the stream socket object used to receive the data. 
</p>

<p class=return>
The function returns a source with the appropriate behavior. 
</p>

<!-- try ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->

<p class=name id=try> 
socket.<b>try(</b>ret<sub>1</sub>, ret<sub>2</sub> ... ret<sub>N</sub><b>)</b>
</p>

<p class=description>
Throws an exception in case of error. 
</p>

<p class=parameters>
</b>Ret<sub>1</sub>, ret<sub>2</sub> ... ret<sub>N</sub> can be arbitrary
arguments, but are usually the return values of a function call that 
nested with the call to <tt>try</tt>. 
</p>

<p class=return> 
The function returns ret<sub>1</sub>, ret<sub>2</sub> ... ret<sub>N</sub> if
ret<sub>1</sub> is not <tt><b>nil</b></tt>. Otherwise, calls <tt>error</tt>
passing ret<sub>2</sub>.
</p>

<pre class=example>
-- connects or throws an exception with the appropriate error message
c = socket.try(socket.connect("localhost", 80))
</pre>

<!-- version ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->

<p class=name id=version> 
socket.<b>VERSION</b>
</p>

<p class=description>
This constant has a string describing the current LuaSocket version. 
</p>

<!-- footer +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->

<div class=footer>
<hr>
<center>
<p class=bar>
<a href="home.html">home</a> &middot;
<a href="home.html#down">download</a> &middot;
<a href="introduction.html">introduction</a> &middot;
<a href="reference.html">reference</a>
</p>
<p>
<small>
Last modified by Diego Nehab on <br>
Sat Aug 9 01:00:41 PDT 2003
</small>
</p>
</center>
</div>

</body>
</html>