-
Notifications
You must be signed in to change notification settings - Fork 3
/
listing1.html
executable file
·285 lines (244 loc) · 10.4 KB
/
listing1.html
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
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
<html>
<head>
<!-- BEGIN META TAG INFO -->
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<link rel="home" href="http://developer.apple.com/">
<link rel="find" href="http://developer.apple.com/search/">
<link rel="stylesheet" type="text/css" href="../../documentation/css/adcstyle.css" title="fonts">
<script language="JavaScript" src="../../documentation/js/adc.js" type="text/javascript"></script>
<!-- END META TAG INFO -->
<!-- BEGIN TITLE -->
<title>SocketCancel - /Read Me About SocketCancel.txt</title>
<!-- END TITLE -->
<script language="JavaScript">
function JumpToNewPage() {
window.location=document.scpopupmenu.gotop.value;
return true;
}
</script>
</head>
<!-- BEGIN BODY OPEN -->
<body>
<!--END BODY OPEN -->
<!-- START CENTER OPEN -->
<center>
<!-- END CENTER OPEN -->
<!-- BEGIN LOGO AND SEARCH -->
<!--#include virtual="/includes/adcnavbar"-->
<!-- END LOGO AND SEARCH -->
<!-- START BREADCRUMB -->
<div id="breadcrumb">
<table width="680" border="0" cellpadding="0" cellspacing="0">
<tr>
<td scope="row"><img width="340" height="10" src="images/1dot.gif" alt=""></td>
<td><img width="340" height="10" src="images/1dot.gif" alt=""></td>
</tr>
<tr valign="middle">
<td align="left" colspan="2">
<a href="http://developer.apple.com/">ADC Home</a> > <a href="../../referencelibrary/index.html">Reference Library</a> > <a href="../../samplecode/index.html">Sample Code</a> > <a href="../../samplecode/Darwin/index.html">Darwin</a> > <a href="../../samplecode/Darwin/idxNetworking-date.html">Networking</a> > <A HREF="javascript:location.replace('index.html');">SocketCancel</A> >
</td>
</tr>
<tr>
<td colspan="2" scope="row"><img width="680" height="35" src="images/1dot.gif" alt=""></td>
</tr>
</table>
</div>
<!-- END BREADCRUMB -->
<!-- START MAIN CONTENT -->
<!-- START TITLE GRAPHIC AND INTRO-->
<table width="680" border="0" cellpadding="0" cellspacing="0">
<tr align="left" valign="top">
<td><h1><div id="pagehead">SocketCancel</div></h1></td>
</tr>
</table>
<!-- END TITLE GRAPHIC AND INTRO -->
<!-- START WIDE COLUMN -->
<table width="680" border="0" cellpadding="0" cellspacing="0">
<tr align="left" valign="top">
<td id="scdetails">
<h2>/Read Me About SocketCancel.txt</h2>
<form name="scpopupmenu" onSubmit="return false;" method=post>
<p><strong>View Source Code:</strong>
<select name="gotop" onChange="JumpToNewPage();" style="width:340px"><option selected value="ingnore">Select File</option>
<option value="listing1.html">/Read Me About SocketCancel.txt</option>
<option value="listing2.html">/SocketCancel.c</option></select>
</p>
</form>
<p><strong><a href="SocketCancel.zip">Download Sample</a></strong> (“SocketCancel.zip”, 33.0K)<BR>
<strong><a href="SocketCancel.dmg">Download Sample</a></strong> (“SocketCancel.dmg”, 94.0K)</p>
<!--
<p><strong><a href="#">Download Sample</a></strong> (“filename.sit”, 500K)</p>
-->
</td>
</tr>
<tr>
<td scope="row"><img width="680" height="10" src="images/1dot.gif" alt=""><br>
<img height="1" width="680" src="images/1dot_919699.gif" alt=""><br>
<img width="680" height="20" src="images/1dot.gif" alt=""></td>
</tr>
<tr>
<td scope="row">
<!--googleon: index -->
<pre class="sourcecodebox">Read Me About SocketCancel
==========================
1.1
SocketCancel is a sample that shows how to use safely cancel threads that are
blocked within BSD sockets calls. It uses a simple sockets abstraction layer
that wraps a non-blocking data socket, a UNIX domain socket pair that's used to
signal cancellation, and creative use of the select system call.
SocketCancel should work on all versions of Mac OS X. It was originally
written and tested on Mac OS X 10.2.x. This version was tested on Mac OS X
10.4.
Packing List
------------
The sample contains the following items:
o Read Me About SocketCancel.txt -- This document.
o SocketCancel.xcodeproj -- An Xcode 2.1 project file.
o SocketCancel.c -- Source code to the sample.
o build -- A folder containing a built version of the sample.
Using the Sample
----------------
To use SocketCancel, open a Terminal window, change into the
"build/Development" directory, and then enter some test commands. The standard
sequence that I use is as follows.
$ ./SocketCancel 1.2.3.4
Test connect and read to 1.2.3.4
Main thread is looking up name.
SIGINT (typically ^C) to cancel
Connect thread is connecting.
^C
Connect thread done, err = 89
threadResult = 89
Success!
In this first example, SocketCancel will attempt to connect to port 80 on an
unknown host. The connection thread will block waiting for the connect to
complete. If you enter a SIGINT (usually by typing control-C), the main thread
will cancel the connection attempt and the connection thread will terminate with
error 89 (ECANCELED).
$ ./SocketCancel www.stanford.edu.
Test connect and read to www.stanford.edu.
Main thread is looking up name.
SIGINT (typically ^C) to cancel
Connect thread is connecting.
Connect thread is reading.
^C
Connect thread done, err = 89
threadResult = 89
Success!
In the second example, SocketCancel will attempt to connect to www.stanford.edu
and then read data. The connection thread will block waiting for data because a
web server will not send you any data until you send it a request. If you
enter a SIGINT, the main thread will cancel the read and the connection thread
will terminate with error 89 (ECANCELED).
$ ./SocketCancel www.apple.com.
Test connect and read to www.apple.com.
Main thread is looking up name.
SIGINT (typically ^C) to cancel
Connect thread is connecting.
Connect thread is reading.
Looks like the server threw us off.
Connect thread done, err = 32
^C
threadResult = 32
Success!
In the third example, SocketCancel will attempt to connect to www.apple.com and
then read data. The connection thread will block waiting for data because a web
server will not send you any data until you send it a request. If you wait for
a short time, the connection thread will terminate with error 32 (EPIPE) after
the server terminates the connection because the client hasn't sent it a
request quickly enough. You must then enter a SIGINT to terminate the main
thread.
$ ./SocketCancel
Test write to localhost
Connect thread is connecting.
Connect thread is writing.
SIGINT (typically ^C) to cancel
^C
Connect thread done, err = 89
threadResult = 89
Success!
In the fourth example, SocketCancel will create a listening socket on the local
machine and then create a thread that connects to that socket and sends it a lot
of data. The main thread never reads the data, so the writing thread will
eventually block waiting for socket buffer space. If you enter a SIGINT, the
main thread will cancel the write and the writing thread will terminate with
error 89 (ECANCELED).
Building the Sample
-------------------
The sample was built using Xcode 2.1 on Mac OS X 10.4. You should be able to
just open the project and choose Build from the Build menu. This will build
the SocketCancel tool in the "Build" directory.
How it Works
------------
SocketCancel includes a simple sockets abstraction layer, CSocket (for
cancelable socket). The abstraction layer wraps each of the common sockets
APIs (socket, connect, read, write, close). The wrapper uses a non-blocking
socket for the main data transfer, and a pair of UNIX domain sockets to signal
cancellation. When an operation blocks (such as a read waiting for data), the
wrapper function waits in a call to select, monitoring both the non-blocking
data socket and the cancellation socket. If data arrives on the data socket,
it reads the data. On the other hand, if data arrives on the cancellation
socket, it returns with an ECANCELED error.
Caveats
-------
Cancellation only works when the socket blocks waiting for the network. If the
socket never blocks (for example, a continuous stream of data arrives), the
cancellation function has no effect. This shouldn't be a serious problem
because, as a rule, if you're processing that much data you're making multiple
calls to the read function, which gives you an opportunity to notice the
cancellation yourself.
I have only wrapped the basic sockets functions. More advanced sockets
functions are left as an exercise for the user.
Credits and Version History
---------------------------
If you find any problems with this sample, mail <[email protected]> and I'll try to
fix them up.
1.0a1 (Jul 2003) was the first shipping version.
1.1 (Aug 2005) was updated to include a project that produces a universal
binary. No code changes were required for it to run correctly on the Developer
Transition Systems.
Share and Enjoy.
Apple Developer Technical Support
Networking, Communications, Hardware
2 Aug 2005
$Log: Read\040Me\040About\040SocketCancel.txt,v $
Revision 1.2 2005/08/03 13:52:31
Fix grammo. Add CVS checkin change logging.
</pre>
<!--googleoff: index -->
</td>
</tr>
</table>
<!-- END WIDE COLUMN -->
<!-- END MAIN CONTENT -->
<table width="680" border="0" cellpadding="0" cellspacing="0">
<tr>
<td><div style="width: 100%; height: 1px; background-color: #919699; margin-top: 5px; margin-bottom: 15px"></div></td>
</tr>
<tr>
<td align="center"><br/>
<table border="0" cellpadding="0" cellspacing="0" class="graybox">
<tr>
<th>Did this document help you?</th>
</tr>
<tr>
<td>
<div style="margin-bottom: 8px"><a href="http://developer.apple.com/feedback/?v=1&url=/samplecode/SocketCancel/listing1.html%3Fid%3DDTS10000717-1.0&media=dvd" target=_new>Yes</a>: Tell us what works for you.</div>
<div style="margin-bottom: 8px"><a href="http://developer.apple.com/feedback/?v=2&url=/samplecode/SocketCancel/listing1.html%3Fid%3DDTS10000717-1.0&media=dvd" target=_new>It’s good, but:</a> Report typos, inaccuracies, and so forth.</div>
<div><a href="http://developer.apple.com/feedback/?v=3&url=/samplecode/SocketCancel/listing1.html%3Fid%3DDTS10000717-1.0&media=dvd" target=_new>It wasn’t helpful</a>: Tell us what would have helped.</div>
</td>
</tr>
</table>
</td>
</tr>
</table>
<!-- START BOTTOM APPLE NAVIGATION -->
<!--#include virtual="/includes/footer"-->
<!-- END BOTTOM APPLE NAVIGATION -->
<!-- START CENTER CLOSE -->
</center>
<!-- END CENTER CLOSE -->
</body>
</html>