|
1 /**************************************************************************** |
|
2 ** |
|
3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). |
|
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 |