source: trunk/src/qt3support/network/q3socketdevice.cpp@ 348

Last change on this file since 348 was 2, checked in by Dmitry A. Kuminov, 16 years ago

Initially imported qt-all-opensource-src-4.5.1 from Trolltech.

File size: 20.7 KB
Line 
1/****************************************************************************
2**
3** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
4** Contact: Qt Software Information ([email protected])
5**
6** This file is part of the Qt3Support module of the Qt Toolkit.
7**
8** $QT_BEGIN_LICENSE:LGPL$
9** Commercial Usage
10** Licensees holding valid Qt Commercial licenses may use this file in
11** accordance with the Qt Commercial License Agreement provided with the
12** Software or, alternatively, in accordance with the terms contained in
13** a written agreement between you and Nokia.
14**
15** GNU Lesser General Public License Usage
16** Alternatively, this file may be used under the terms of the GNU Lesser
17** General Public License version 2.1 as published by the Free Software
18** Foundation and appearing in the file LICENSE.LGPL included in the
19** packaging of this file. Please review the following information to
20** ensure the GNU Lesser General Public License version 2.1 requirements
21** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
22**
23** In addition, as a special exception, Nokia gives you certain
24** additional rights. These rights are described in the Nokia Qt LGPL
25** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
26** package.
27**
28** GNU General Public License Usage
29** Alternatively, this file may be used under the terms of the GNU
30** General Public License version 3.0 as published by the Free Software
31** Foundation and appearing in the file LICENSE.GPL included in the
32** packaging of this file. Please review the following information to
33** ensure the GNU General Public License version 3.0 requirements will be
34** met: http://www.gnu.org/copyleft/gpl.html.
35**
36** If you are unsure which license is appropriate for your use, please
37** contact the sales department at [email protected].
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
48QT_BEGIN_NAMESPACE
49
50//#define Q3SOCKETDEVICE_DEBUG
51
52
53class Q3SocketDevicePrivate
54{
55public:
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*/
159Q3SocketDevice::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*/
182Q3SocketDevice::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*/
211Q3SocketDevice::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*/
226Q3SocketDevice::~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*/
242bool 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*/
256Q3SocketDevice::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*/
273Q3SocketDevice::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*/
285int 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*/
304void 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*/
328bool 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*/
347bool 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*/
358QIODevice::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*/
368QIODevice::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*/
380bool 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*/
392bool 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*/
404bool 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*/
423void 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*/
434int 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*/
451void 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*/
462int 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*/
478void 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*/
492quint16 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*/
503QHostAddress Q3SocketDevice::address() const
504{
505 return a;
506}
507
508
509/*!
510 Returns the first error seen.
511*/
512Q3SocketDevice::Error Q3SocketDevice::error() const
513{
514 return e;
515}
516
517
518/*!
519 Allows subclasses to set the error state to \a err.
520*/
521void 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
755QT_END_NAMESPACE
756
757#endif //QT_NO_NETWORK
Note: See TracBrowser for help on using the repository browser.