author | Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> |
Fri, 16 Apr 2010 15:50:13 +0300 | |
changeset 18 | 2f34d5167611 |
parent 0 | 1918ee327afb |
permissions | -rw-r--r-- |
0 | 1 |
/**************************************************************************** |
2 |
** |
|
18
2f34d5167611
Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
3 |
** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). |
0 | 4 |
** All rights reserved. |
5 |
** Contact: Nokia Corporation (qt-info@nokia.com) |
|
6 |
** |
|
7 |
** This file is part of the Qt3Support module of the Qt Toolkit. |
|
8 |
** |
|
9 |
** $QT_BEGIN_LICENSE:LGPL$ |
|
10 |
** No Commercial Usage |
|
11 |
** This file contains pre-release code and may not be distributed. |
|
12 |
** You may use this file in accordance with the terms and conditions |
|
13 |
** contained in the Technology Preview License Agreement accompanying |
|
14 |
** this package. |
|
15 |
** |
|
16 |
** GNU Lesser General Public License Usage |
|
17 |
** Alternatively, this file may be used under the terms of the GNU Lesser |
|
18 |
** General Public License version 2.1 as published by the Free Software |
|
19 |
** Foundation and appearing in the file LICENSE.LGPL included in the |
|
20 |
** packaging of this file. Please review the following information to |
|
21 |
** ensure the GNU Lesser General Public License version 2.1 requirements |
|
22 |
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. |
|
23 |
** |
|
24 |
** In addition, as a special exception, Nokia gives you certain additional |
|
25 |
** rights. These rights are described in the Nokia Qt LGPL Exception |
|
26 |
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. |
|
27 |
** |
|
28 |
** If you have questions regarding the use of this file, please contact |
|
29 |
** Nokia at qt-info@nokia.com. |
|
30 |
** |
|
31 |
** |
|
32 |
** |
|
33 |
** |
|
34 |
** |
|
35 |
** |
|
36 |
** |
|
37 |
** |
|
38 |
** $QT_END_LICENSE$ |
|
39 |
** |
|
40 |
****************************************************************************/ |
|
41 |
||
42 |
#include "q3socketdevice.h" |
|
43 |
#ifndef QT_NO_NETWORK |
|
44 |
||
45 |
#include "qwindowdefs.h" |
|
46 |
#include <string.h> |
|
47 |
||
48 |
QT_BEGIN_NAMESPACE |
|
49 |
||
50 |
//#define Q3SOCKETDEVICE_DEBUG |
|
51 |
||
52 |
||
53 |
class Q3SocketDevicePrivate |
|
54 |
{ |
|
55 |
public: |
|
56 |
Q3SocketDevicePrivate( Q3SocketDevice::Protocol p ) |
|
57 |
: protocol(p) |
|
58 |
{ } |
|
59 |
||
60 |
Q3SocketDevice::Protocol protocol; |
|
61 |
}; |
|
62 |
||
63 |
||
64 |
/*! |
|
65 |
\class Q3SocketDevice |
|
66 |
\brief The Q3SocketDevice class provides a platform-independent low-level socket API. |
|
67 |
||
68 |
\compat |
|
69 |
\reentrant |
|
70 |
||
71 |
This class provides a low level API for working with sockets. Users of |
|
72 |
this class are assumed to have networking experience. For most users the |
|
73 |
Q3Socket class provides a much easier and high level alternative, but |
|
74 |
certain things (like UDP) can't be done with Q3Socket and if you need a |
|
75 |
platform-independent API for those, Q3SocketDevice is the right choice. |
|
76 |
||
77 |
The essential purpose of the class is to provide a QIODevice that |
|
78 |
works on sockets, wrapped in a platform-independent API. |
|
79 |
||
80 |
When calling connect() or bind(), Q3SocketDevice detects the |
|
81 |
protocol family (IPv4, IPv6) automatically. Passing the protocol |
|
82 |
family to Q3SocketDevice's constructor or to setSocket() forces |
|
83 |
creation of a socket device of a specific protocol. If not set, the |
|
84 |
protocol will be detected at the first call to connect() or bind(). |
|
85 |
||
86 |
\sa Q3Socket, QSocketNotifier, QHostAddress |
|
87 |
*/ |
|
88 |
||
89 |
||
90 |
/*! |
|
91 |
\enum Q3SocketDevice::Protocol |
|
92 |
||
93 |
This enum type describes the protocol family of the socket. Possible values |
|
94 |
are: |
|
95 |
||
96 |
\value IPv4 The socket is an IPv4 socket. |
|
97 |
\value IPv6 The socket is an IPv6 socket. |
|
98 |
\value Unknown The protocol family of the socket is not known. This can |
|
99 |
happen if you use Q3SocketDevice with an already existing socket; it |
|
100 |
tries to determine the protocol family, but this can fail if the |
|
101 |
protocol family is not known to Q3SocketDevice. |
|
102 |
||
103 |
\sa protocol() setSocket() |
|
104 |
*/ |
|
105 |
||
106 |
/*! |
|
107 |
\enum Q3SocketDevice::Error |
|
108 |
||
109 |
This enum type describes the error states of Q3SocketDevice. |
|
110 |
||
111 |
\value NoError No error has occurred. |
|
112 |
||
113 |
\value AlreadyBound The device is already bound, according to bind(). |
|
114 |
||
115 |
\value Inaccessible The operating system or firewall prohibited |
|
116 |
the action. |
|
117 |
||
118 |
\value NoResources The operating system ran out of a resource. |
|
119 |
||
120 |
\value InternalError An internal error occurred in Q3SocketDevice. |
|
121 |
||
122 |
\value Impossible An attempt was made to do something which makes |
|
123 |
no sense. For example: |
|
124 |
\snippet doc/src/snippets/code/src_qt3support_network_q3socketdevice.cpp 0 |
|
125 |
The libc ::close() closes the socket, but Q3SocketDevice is not aware |
|
126 |
of this. So when you call writeBlock(), the impossible happens. |
|
127 |
||
128 |
\value NoFiles The operating system will not let Q3SocketDevice open |
|
129 |
another file. |
|
130 |
||
131 |
\value ConnectionRefused A connection attempt was rejected by the |
|
132 |
peer. |
|
133 |
||
134 |
\value NetworkFailure There is a network failure. |
|
135 |
||
136 |
\value UnknownError The operating system did something |
|
137 |
unexpected. |
|
138 |
||
139 |
\omitvalue Bug |
|
140 |
*/ |
|
141 |
||
142 |
/*! |
|
143 |
\enum Q3SocketDevice::Type |
|
144 |
||
145 |
This enum type describes the type of the socket: |
|
146 |
\value Stream a stream socket (TCP, usually) |
|
147 |
\value Datagram a datagram socket (UDP, usually) |
|
148 |
*/ |
|
149 |
||
150 |
||
151 |
/*! |
|
152 |
Creates a Q3SocketDevice object for the existing socket \a socket. |
|
153 |
||
154 |
The \a type argument must match the actual socket type; use \c |
|
155 |
Q3SocketDevice::Stream for a reliable, connection-oriented TCP |
|
156 |
socket, or Q3SocketDevice::Datagram for an unreliable, |
|
157 |
connectionless UDP socket. |
|
158 |
*/ |
|
159 |
Q3SocketDevice::Q3SocketDevice( int socket, Type type ) |
|
160 |
: fd( socket ), t( type ), p( 0 ), pp( 0 ), e( NoError ), |
|
161 |
d(new Q3SocketDevicePrivate(Unknown)) |
|
162 |
{ |
|
163 |
#if defined(Q3SOCKETDEVICE_DEBUG) |
|
164 |
qDebug( "Q3SocketDevice: Created Q3SocketDevice %p (socket %x, type %d)", |
|
165 |
this, socket, type ); |
|
166 |
#endif |
|
167 |
init(); |
|
168 |
setSocket( socket, type ); |
|
169 |
} |
|
170 |
||
171 |
/*! |
|
172 |
Creates a Q3SocketDevice object for a stream or datagram socket. |
|
173 |
||
174 |
The \a type argument must be either Q3SocketDevice::Stream for a |
|
175 |
reliable, connection-oriented TCP socket, or \c |
|
176 |
Q3SocketDevice::Datagram for an unreliable UDP socket. |
|
177 |
||
178 |
The socket is created as an IPv4 socket. |
|
179 |
||
180 |
\sa blocking() protocol() |
|
181 |
*/ |
|
182 |
Q3SocketDevice::Q3SocketDevice( Type type ) |
|
183 |
: fd( -1 ), t( type ), p( 0 ), pp( 0 ), e( NoError ), |
|
184 |
d(new Q3SocketDevicePrivate(IPv4)) |
|
185 |
{ |
|
186 |
#if defined(Q3SOCKETDEVICE_DEBUG) |
|
187 |
qDebug( "Q3SocketDevice: Created Q3SocketDevice object %p, type %d", |
|
188 |
this, type ); |
|
189 |
#endif |
|
190 |
init(); |
|
191 |
setSocket( createNewSocket(), type ); |
|
192 |
} |
|
193 |
||
194 |
/*! |
|
195 |
Creates a Q3SocketDevice object for a stream or datagram socket. |
|
196 |
||
197 |
The \a type argument must be either Q3SocketDevice::Stream for a |
|
198 |
reliable, connection-oriented TCP socket, or \c |
|
199 |
Q3SocketDevice::Datagram for an unreliable UDP socket. |
|
200 |
||
201 |
The \a protocol indicates whether the socket should be of type IPv4 |
|
202 |
or IPv6. Passing \c Unknown is not meaningful in this context and you |
|
203 |
should avoid using (it creates an IPv4 socket, but your code is not easily |
|
204 |
readable). |
|
205 |
||
206 |
The argument \a dummy is necessary for compatibility with some |
|
207 |
compilers. |
|
208 |
||
209 |
\sa blocking() protocol() |
|
210 |
*/ |
|
211 |
Q3SocketDevice::Q3SocketDevice( Type type, Protocol protocol, int ) |
|
212 |
: fd( -1 ), t( type ), p( 0 ), pp( 0 ), e( NoError ), |
|
213 |
d(new Q3SocketDevicePrivate(protocol)) |
|
214 |
{ |
|
215 |
#if defined(Q3SOCKETDEVICE_DEBUG) |
|
216 |
qDebug( "Q3SocketDevice: Created Q3SocketDevice object %p, type %d", |
|
217 |
this, type ); |
|
218 |
#endif |
|
219 |
init(); |
|
220 |
setSocket( createNewSocket(), type ); |
|
221 |
} |
|
222 |
||
223 |
/*! |
|
224 |
Destroys the socket device and closes the socket if it is open. |
|
225 |
*/ |
|
226 |
Q3SocketDevice::~Q3SocketDevice() |
|
227 |
{ |
|
228 |
close(); |
|
229 |
delete d; |
|
230 |
d = 0; |
|
231 |
#if defined(Q3SOCKETDEVICE_DEBUG) |
|
232 |
qDebug( "Q3SocketDevice: Destroyed Q3SocketDevice %p", this ); |
|
233 |
#endif |
|
234 |
} |
|
235 |
||
236 |
||
237 |
/*! |
|
238 |
Returns true if this is a valid socket; otherwise returns false. |
|
239 |
||
240 |
\sa socket() |
|
241 |
*/ |
|
242 |
bool Q3SocketDevice::isValid() const |
|
243 |
{ |
|
244 |
return fd != -1; |
|
245 |
} |
|
246 |
||
247 |
||
248 |
/*! |
|
249 |
\fn Type Q3SocketDevice::type() const |
|
250 |
||
251 |
Returns the socket type which is either Q3SocketDevice::Stream |
|
252 |
or Q3SocketDevice::Datagram. |
|
253 |
||
254 |
\sa socket() |
|
255 |
*/ |
|
256 |
Q3SocketDevice::Type Q3SocketDevice::type() const |
|
257 |
{ |
|
258 |
return t; |
|
259 |
} |
|
260 |
||
261 |
/*! |
|
262 |
Returns the socket's protocol family, which is one of \c Unknown, \c IPv4, |
|
263 |
or \c IPv6. |
|
264 |
||
265 |
Q3SocketDevice either creates a socket with a well known protocol family or |
|
266 |
it uses an already existing socket. In the first case, this function |
|
267 |
returns the protocol family it was constructed with. In the second case, it |
|
268 |
tries to determine the protocol family of the socket; if this fails, it |
|
269 |
returns \c Unknown. |
|
270 |
||
271 |
\sa Protocol setSocket() |
|
272 |
*/ |
|
273 |
Q3SocketDevice::Protocol Q3SocketDevice::protocol() const |
|
274 |
{ |
|
275 |
if ( d->protocol == Unknown ) |
|
276 |
d->protocol = getProtocol(); |
|
277 |
return d->protocol; |
|
278 |
} |
|
279 |
||
280 |
/*! |
|
281 |
Returns the socket number, or -1 if it is an invalid socket. |
|
282 |
||
283 |
\sa isValid(), type() |
|
284 |
*/ |
|
285 |
int Q3SocketDevice::socket() const |
|
286 |
{ |
|
287 |
return fd; |
|
288 |
} |
|
289 |
||
290 |
||
291 |
/*! |
|
292 |
Sets the socket device to operate on the existing socket \a |
|
293 |
socket. |
|
294 |
||
295 |
The \a type argument must match the actual socket type; use \c |
|
296 |
Q3SocketDevice::Stream for a reliable, connection-oriented TCP |
|
297 |
socket, or Q3SocketDevice::Datagram for an unreliable, |
|
298 |
connectionless UDP socket. |
|
299 |
||
300 |
Any existing socket is closed. |
|
301 |
||
302 |
\sa isValid(), close() |
|
303 |
*/ |
|
304 |
void Q3SocketDevice::setSocket( int socket, Type type ) |
|
305 |
{ |
|
306 |
if ( fd != -1 ) // close any open socket |
|
307 |
close(); |
|
308 |
#if defined(Q3SOCKETDEVICE_DEBUG) |
|
309 |
qDebug( "Q3SocketDevice::setSocket: socket %x, type %d", socket, type ); |
|
310 |
#endif |
|
311 |
t = type; |
|
312 |
fd = socket; |
|
313 |
d->protocol = Unknown; |
|
314 |
e = NoError; |
|
315 |
resetStatus(); |
|
316 |
open( ReadWrite ); |
|
317 |
fetchConnectionParameters(); |
|
318 |
} |
|
319 |
||
320 |
||
321 |
/*! |
|
322 |
Opens the socket using the specified QIODevice file \a mode. This |
|
323 |
function is called from the Q3SocketDevice constructors and from |
|
324 |
the setSocket() function. You should not call it yourself. |
|
325 |
||
326 |
\sa close() |
|
327 |
*/ |
|
328 |
bool Q3SocketDevice::open( OpenMode mode ) |
|
329 |
{ |
|
330 |
if ( isOpen() || !isValid() ) |
|
331 |
return false; |
|
332 |
#if defined(Q3SOCKETDEVICE_DEBUG) |
|
333 |
qDebug( "Q3SocketDevice::open: mode %x", mode ); |
|
334 |
#endif |
|
335 |
setOpenMode( (mode & ReadWrite) | Unbuffered ); |
|
336 |
return true; |
|
337 |
} |
|
338 |
||
339 |
/*! |
|
340 |
\fn bool Q3SocketDevice::open(int mode) |
|
341 |
\overload |
|
342 |
*/ |
|
343 |
/*! |
|
344 |
The current Q3SocketDevice implementation does not buffer at all, |
|
345 |
so this is a no-op. This function always returns true. |
|
346 |
*/ |
|
347 |
bool Q3SocketDevice::flush() |
|
348 |
{ |
|
349 |
return true; |
|
350 |
} |
|
351 |
||
352 |
||
353 |
/*! |
|
354 |
\reimp |
|
355 |
||
356 |
The size is meaningless for a socket, therefore this function returns 0. |
|
357 |
*/ |
|
358 |
QIODevice::Offset Q3SocketDevice::size() const |
|
359 |
{ |
|
360 |
return 0; |
|
361 |
} |
|
362 |
||
363 |
||
364 |
/*! |
|
365 |
The read/write index is meaningless for a socket, therefore this |
|
366 |
function returns 0. |
|
367 |
*/ |
|
368 |
QIODevice::Offset Q3SocketDevice::at() const |
|
369 |
{ |
|
370 |
return 0; |
|
371 |
} |
|
372 |
||
373 |
||
374 |
/*! |
|
375 |
The read/write index is meaningless for a socket, therefore this |
|
376 |
function does nothing and returns true. |
|
377 |
||
378 |
The \a offset parameter is ignored. |
|
379 |
*/ |
|
380 |
bool Q3SocketDevice::at( Offset /* offset */ ) |
|
381 |
{ |
|
382 |
return true; |
|
383 |
} |
|
384 |
||
385 |
||
386 |
/*! |
|
387 |
\reimp |
|
388 |
||
389 |
Returns true if no data is currently available at the socket; |
|
390 |
otherwise returns false. |
|
391 |
*/ |
|
392 |
bool Q3SocketDevice::atEnd() const |
|
393 |
{ |
|
394 |
return bytesAvailable() <= 0; |
|
395 |
} |
|
396 |
||
397 |
/*! |
|
398 |
Returns true if the address of this socket can be used by other |
|
399 |
sockets at the same time, and false if this socket claims |
|
400 |
exclusive ownership. |
|
401 |
||
402 |
\sa setAddressReusable() |
|
403 |
*/ |
|
404 |
bool Q3SocketDevice::addressReusable() const |
|
405 |
{ |
|
406 |
return option( ReuseAddress ); |
|
407 |
} |
|
408 |
||
409 |
||
410 |
/*! |
|
411 |
Sets the address of this socket to be usable by other sockets too |
|
412 |
if \a enable is true, and to be used exclusively by this socket if |
|
413 |
\a enable is false. |
|
414 |
||
415 |
When a socket is reusable, other sockets can use the same port |
|
416 |
number (and IP address), which is generally useful. Of course |
|
417 |
other sockets cannot use the same |
|
418 |
(address,port,peer-address,peer-port) 4-tuple as this socket, so |
|
419 |
there is no risk of confusing the two TCP connections. |
|
420 |
||
421 |
\sa addressReusable() |
|
422 |
*/ |
|
423 |
void Q3SocketDevice::setAddressReusable( bool enable ) |
|
424 |
{ |
|
425 |
setOption( ReuseAddress, enable ); |
|
426 |
} |
|
427 |
||
428 |
||
429 |
/*! |
|
430 |
Returns the size of the operating system receive buffer. |
|
431 |
||
432 |
\sa setReceiveBufferSize() |
|
433 |
*/ |
|
434 |
int Q3SocketDevice::receiveBufferSize() const |
|
435 |
{ |
|
436 |
return option( ReceiveBuffer ); |
|
437 |
} |
|
438 |
||
439 |
||
440 |
/*! |
|
441 |
Sets the size of the operating system receive buffer to \a size. |
|
442 |
||
443 |
The operating system receive buffer size effectively limits two |
|
444 |
things: how much data can be in transit at any one moment, and how |
|
445 |
much data can be received in one iteration of the main event loop. |
|
446 |
||
447 |
The default is operating system-dependent. A socket that receives |
|
448 |
large amounts of data is probably best with a buffer size of |
|
449 |
49152. |
|
450 |
*/ |
|
451 |
void Q3SocketDevice::setReceiveBufferSize( uint size ) |
|
452 |
{ |
|
453 |
setOption( ReceiveBuffer, size ); |
|
454 |
} |
|
455 |
||
456 |
||
457 |
/*! |
|
458 |
Returns the size of the operating system send buffer. |
|
459 |
||
460 |
\sa setSendBufferSize() |
|
461 |
*/ |
|
462 |
int Q3SocketDevice::sendBufferSize() const |
|
463 |
{ |
|
464 |
return option( SendBuffer ); |
|
465 |
} |
|
466 |
||
467 |
||
468 |
/*! |
|
469 |
Sets the size of the operating system send buffer to \a size. |
|
470 |
||
471 |
The operating system send buffer size effectively limits how much |
|
472 |
data can be in transit at any one moment. |
|
473 |
||
474 |
The default is operating system-dependent. A socket that sends |
|
475 |
large amounts of data is probably best with a buffer size of |
|
476 |
49152. |
|
477 |
*/ |
|
478 |
void Q3SocketDevice::setSendBufferSize( uint size ) |
|
479 |
{ |
|
480 |
setOption( SendBuffer, size ); |
|
481 |
} |
|
482 |
||
483 |
||
484 |
/*! |
|
485 |
Returns the port number of this socket device. This may be 0 for a |
|
486 |
while, but is set to something sensible as soon as a sensible |
|
487 |
value is available. |
|
488 |
||
489 |
Note that Qt always uses native byte order, i.e. 67 is 67 in Qt; |
|
490 |
there is no need to call htons(). |
|
491 |
*/ |
|
492 |
quint16 Q3SocketDevice::port() const |
|
493 |
{ |
|
494 |
return p; |
|
495 |
} |
|
496 |
||
497 |
||
498 |
/*! |
|
499 |
Returns the address of this socket device. This may be 0.0.0.0 for |
|
500 |
a while, but is set to something sensible as soon as a sensible |
|
501 |
value is available. |
|
502 |
*/ |
|
503 |
QHostAddress Q3SocketDevice::address() const |
|
504 |
{ |
|
505 |
return a; |
|
506 |
} |
|
507 |
||
508 |
||
509 |
/*! |
|
510 |
Returns the first error seen. |
|
511 |
*/ |
|
512 |
Q3SocketDevice::Error Q3SocketDevice::error() const |
|
513 |
{ |
|
514 |
return e; |
|
515 |
} |
|
516 |
||
517 |
||
518 |
/*! |
|
519 |
Allows subclasses to set the error state to \a err. |
|
520 |
*/ |
|
521 |
void Q3SocketDevice::setError( Error err ) |
|
522 |
{ |
|
523 |
e = err; |
|
524 |
} |
|
525 |
||
526 |
/*! \fn Q3SocketDevice::readBlock(char *data, Q_ULONG maxlen) |
|
527 |
||
528 |
Reads \a maxlen bytes from the socket into \a data and returns the |
|
529 |
number of bytes read. Returns -1 if an error occurred. Returning 0 |
|
530 |
is not an error. For Stream sockets, 0 is returned when the remote |
|
531 |
host closes the connection. For Datagram sockets, 0 is a valid |
|
532 |
datagram size. |
|
533 |
*/ |
|
534 |
||
535 |
/*! \fn Q3SocketDevice::writeBlock(const char *data, Q_ULONG len) |
|
536 |
||
537 |
Writes \a len bytes to the socket from \a data and returns the |
|
538 |
number of bytes written. Returns -1 if an error occurred. |
|
539 |
||
540 |
This is used for Q3SocketDevice::Stream sockets. |
|
541 |
*/ |
|
542 |
||
543 |
/*! |
|
544 |
\fn Q_LONG Q3SocketDevice::writeBlock( const char * data, Q_ULONG len, |
|
545 |
const QHostAddress & host, Q_UINT16 port ) |
|
546 |
\overload |
|
547 |
||
548 |
Writes \a len bytes to the socket from \a data and returns the |
|
549 |
number of bytes written. Returns -1 if an error occurred. |
|
550 |
||
551 |
This is used for Q3SocketDevice::Datagram sockets. You must |
|
552 |
specify the \a host and \a port of the destination of the data. |
|
553 |
*/ |
|
554 |
||
555 |
/*! |
|
556 |
\fn bool Q3SocketDevice::isSequential() const |
|
557 |
\internal |
|
558 |
*/ |
|
559 |
||
560 |
/*! |
|
561 |
\fn qint64 Q3SocketDevice::readData( char *data, qint64 maxlen ) |
|
562 |
||
563 |
Reads \a maxlen bytes from the socket into \a data and returns the |
|
564 |
number of bytes read. Returns -1 if an error occurred. |
|
565 |
*/ |
|
566 |
||
567 |
/*! |
|
568 |
\fn int Q3SocketDevice::createNewSocket() |
|
569 |
||
570 |
Creates a new socket identifier. Returns -1 if there is a failure |
|
571 |
to create the new identifier; error() explains why. |
|
572 |
||
573 |
\sa setSocket() |
|
574 |
*/ |
|
575 |
||
576 |
/*! |
|
577 |
\fn void Q3SocketDevice::close() |
|
578 |
\reimp |
|
579 |
||
580 |
Closes the socket and sets the socket identifier to -1 (invalid). |
|
581 |
||
582 |
(This function ignores errors; if there are any then a file |
|
583 |
descriptor leakage might result. As far as we know, the only error |
|
584 |
that can arise is EBADF, and that would of course not cause |
|
585 |
leakage. There may be OS-specific errors that we haven't come |
|
586 |
across, however.) |
|
587 |
||
588 |
\sa open() |
|
589 |
*/ |
|
590 |
||
591 |
/*! |
|
592 |
\fn bool Q3SocketDevice::blocking() const |
|
593 |
||
594 |
Returns true if the socket is valid and in blocking mode; |
|
595 |
otherwise returns false. |
|
596 |
||
597 |
Note that this function does not set error(). |
|
598 |
||
599 |
\warning On Windows, this function always returns true since the |
|
600 |
ioctlsocket() function is broken. |
|
601 |
||
602 |
\sa setBlocking(), isValid() |
|
603 |
*/ |
|
604 |
||
605 |
/*! |
|
606 |
\fn void Q3SocketDevice::setBlocking( bool enable ) |
|
607 |
||
608 |
Makes the socket blocking if \a enable is true or nonblocking if |
|
609 |
\a enable is false. |
|
610 |
||
611 |
Sockets are blocking by default, but we recommend using |
|
612 |
nonblocking socket operations, especially for GUI programs that |
|
613 |
need to be responsive. |
|
614 |
||
615 |
\warning On Windows, this function should be used with care since |
|
616 |
whenever you use a QSocketNotifier on Windows, the socket is |
|
617 |
immediately made nonblocking. |
|
618 |
||
619 |
\sa blocking(), isValid() |
|
620 |
*/ |
|
621 |
||
622 |
/*! |
|
623 |
\fn int Q3SocketDevice::option( Option opt ) const |
|
624 |
||
625 |
Returns the value of the socket option \a opt. |
|
626 |
*/ |
|
627 |
||
628 |
/*! |
|
629 |
\fn void Q3SocketDevice::setOption( Option opt, int v ) |
|
630 |
||
631 |
Sets the socket option \a opt to \a v. |
|
632 |
*/ |
|
633 |
||
634 |
/*! |
|
635 |
\fn bool Q3SocketDevice::connect( const QHostAddress &addr, Q_UINT16 port ) |
|
636 |
||
637 |
Connects to the IP address and port specified by \a addr and \a |
|
638 |
port. Returns true if it establishes a connection; otherwise returns false. |
|
639 |
If it returns false, error() explains why. |
|
640 |
||
641 |
Note that error() commonly returns NoError for non-blocking |
|
642 |
sockets; this just means that you can call connect() again in a |
|
643 |
little while and it'll probably succeed. |
|
644 |
*/ |
|
645 |
||
646 |
/*! |
|
647 |
\fn bool Q3SocketDevice::bind( const QHostAddress &address, Q_UINT16 port ) |
|
648 |
||
649 |
Assigns a name to an unnamed socket. The name is the host address |
|
650 |
\a address and the port number \a port. If the operation succeeds, |
|
651 |
bind() returns true; otherwise it returns false without changing |
|
652 |
what port() and address() return. |
|
653 |
||
654 |
bind() is used by servers for setting up incoming connections. |
|
655 |
Call bind() before listen(). |
|
656 |
*/ |
|
657 |
||
658 |
/*! |
|
659 |
\fn bool Q3SocketDevice::listen( int backlog ) |
|
660 |
||
661 |
Specifies how many pending connections a server socket can have. |
|
662 |
Returns true if the operation was successful; otherwise returns |
|
663 |
false. A \a backlog value of 50 is quite common. |
|
664 |
||
665 |
The listen() call only applies to sockets where type() is \c |
|
666 |
Stream, i.e. not to \c Datagram sockets. listen() must not be |
|
667 |
called before bind() or after accept(). |
|
668 |
||
669 |
\sa bind(), accept() |
|
670 |
*/ |
|
671 |
||
672 |
/*! |
|
673 |
\fn int Q3SocketDevice::accept() |
|
674 |
||
675 |
Extracts the first connection from the queue of pending |
|
676 |
connections for this socket and returns a new socket identifier. |
|
677 |
Returns -1 if the operation failed. |
|
678 |
||
679 |
\sa bind(), listen() |
|
680 |
*/ |
|
681 |
||
682 |
/*! |
|
683 |
\fn qint64 Q3SocketDevice::bytesAvailable() const |
|
684 |
||
685 |
Returns the number of bytes available for reading, or -1 if an |
|
686 |
error occurred. |
|
687 |
||
688 |
\warning On Microsoft Windows, we use the ioctlsocket() function |
|
689 |
to determine the number of bytes queued on the socket. According |
|
690 |
to Microsoft (KB Q125486), ioctlsocket() sometimes returns an |
|
691 |
incorrect number. The only safe way to determine the amount of |
|
692 |
data on the socket is to read it using readBlock(). QSocket has |
|
693 |
workarounds to deal with this problem. |
|
694 |
*/ |
|
695 |
||
696 |
/*! |
|
697 |
\fn Q_LONG Q3SocketDevice::waitForMore( int msecs, bool *timeout ) const |
|
698 |
||
699 |
Wait up to \a msecs milliseconds for more data to be available. If |
|
700 |
\a msecs is -1 the call will block indefinitely. |
|
701 |
||
702 |
Returns the number of bytes available for reading, or -1 if an |
|
703 |
error occurred. |
|
704 |
||
705 |
If \a timeout is non-null and no error occurred (i.e. it does not |
|
706 |
return -1): this function sets *\a timeout to true, if the reason |
|
707 |
for returning was that the timeout was reached; otherwise it sets |
|
708 |
*\a timeout to false. This is useful to find out if the peer |
|
709 |
closed the connection. |
|
710 |
||
711 |
\warning This is a blocking call and should be avoided in event |
|
712 |
driven applications. |
|
713 |
||
714 |
\sa bytesAvailable() |
|
715 |
*/ |
|
716 |
||
717 |
/*! |
|
718 |
\fn qint64 Q3SocketDevice::writeData( const char *data, qint64 len ) |
|
719 |
||
720 |
Writes \a len bytes to the socket from \a data and returns the |
|
721 |
number of bytes written. Returns -1 if an error occurred. |
|
722 |
||
723 |
This is used for Q3SocketDevice::Stream sockets. |
|
724 |
*/ |
|
725 |
||
726 |
/*! |
|
727 |
\fn void Q3SocketDevice::fetchConnectionParameters() |
|
728 |
||
729 |
Fetches information about both ends of the connection: whatever is |
|
730 |
available. |
|
731 |
*/ |
|
732 |
||
733 |
/*! |
|
734 |
\fn Q_UINT16 Q3SocketDevice::peerPort() const |
|
735 |
||
736 |
Returns the port number of the port this socket device is |
|
737 |
connected to. This may be 0 for a while, but is set to something |
|
738 |
sensible as soon as a sensible value is available. |
|
739 |
||
740 |
Note that for Datagram sockets, this is the source port of the |
|
741 |
last packet received, and that it is in native byte order. |
|
742 |
*/ |
|
743 |
||
744 |
/*! |
|
745 |
\fn QHostAddress Q3SocketDevice::peerAddress() const |
|
746 |
||
747 |
Returns the address of the port this socket device is connected |
|
748 |
to. This may be 0.0.0.0 for a while, but is set to something |
|
749 |
sensible as soon as a sensible value is available. |
|
750 |
||
751 |
Note that for Datagram sockets, this is the source port of the |
|
752 |
last packet received. |
|
753 |
*/ |
|
754 |
||
755 |
QT_END_NAMESPACE |
|
756 |
||
757 |
#endif //QT_NO_NETWORK |