00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
#ifndef KEXTSOCK_H
00021
#define KEXTSOCK_H
00022
00023
#include "kdelibs_export.h"
00024
00025
#ifdef Q_OS_UNIX
00026
00027
#include <sys/time.h>
00028
00029
#include <qstring.h>
00030
#include <qptrlist.h>
00031
#include <qiodevice.h>
00032
00033
#include "kbufferedio.h"
00034
#include "ksockaddr.h"
00035
00036
00037
struct addrinfo;
00038
struct kde_addrinfo;
00039
class KAddressInfo;
00040
class QSocketNotifier;
00041
00042
00043
00044
00045
00046
00047
00048
00049
#define IO_ListenError (IO_UnspecifiedError+1)
00050
#define IO_AcceptError (IO_UnspecifiedError+2)
00051
#define IO_LookupError (IO_UnspecifiedError+3)
00052
00053
class KExtendedSocketPrivate;
00091
class KDECORE_EXPORT KExtendedSocket:
public KBufferedIO
00092 {
00093 Q_OBJECT
00094
00095
public:
00099
enum Flags
00100 {
00101
00102
00103
00104
00105
00106 anySocket = 0x00,
00107 knownSocket = 0x01,
00108 unixSocket = knownSocket | 0x02,
00109 inetSocket = knownSocket | 0x04,
00110 ipv4Socket = inetSocket | 0x100,
00111 ipv6Socket = inetSocket | 0x200,
00112
00113 passiveSocket = 0x1000,
00114 canonName = 0x2000,
00115 noResolve = 0x4000,
00116
00117 streamSocket = 0x8000,
00118 datagramSocket = 0x10000,
00119 rawSocket = 0x20000,
00120
00121 inputBufferedSocket = 0x200000,
00122 outputBufferedSocket = 0x400000,
00123 bufferedSocket = 0x600000
00124 };
00125
00131
enum SockStatus
00132 {
00133
00134 error = -1,
00135
00136 nothing = 0,
00137
00138 lookupInProgress = 50,
00139 lookupDone = 70,
00140
00141
00142 created = 100,
00143 bound = 140,
00144
00145 connecting = 200,
00146 connected = 220,
00147
00148 listening = 200,
00149 accepting = 220,
00150
00151 closing = 350,
00152
00153 done = 400
00154 };
00155
00156
public:
00160 KExtendedSocket();
00161
00178 KExtendedSocket(
const QString& host,
int port,
int flags = 0);
00179
00196 KExtendedSocket(
const QString& host,
const QString& service,
int flags = 0);
00197
00202
virtual ~KExtendedSocket();
00203
00209
void reset();
00210
00211
00212
00213
00214
00220
int socketStatus() const;
00221
00228
int systemError() const;
00229
00235
int setSocketFlags(
int flags);
00236
00242
int socketFlags() const;
00243
00257
bool setHost(const
QString& host);
00258
00263
QString host() const;
00264
00269
bool setPort(
int port);
00270
00280
bool setPort(const
QString& port);
00281
00286
QString port() const;
00287
00297
bool setAddress(const
QString& host,
int port);
00298
00308
bool setAddress(const
QString& host, const
QString& serv);
00309
00315
bool setBindHost(const
QString& host);
00316
00321
bool unsetBindHost();
00322
00327
QString bindHost() const;
00328
00334
bool setBindPort(
int port);
00335
00341
bool setBindPort(const
QString& service);
00342
00347
bool unsetBindPort();
00348
00353
QString bindPort() const;
00354
00362
bool setBindAddress(const
QString& host,
int port);
00363
00371
bool setBindAddress(const
QString& host, const
QString& service);
00372
00378
bool unsetBindAddress();
00379
00391
bool setTimeout(
int secs,
int usecs = 0);
00392
00397 timeval timeout() const;
00398
00407
bool setBlockingMode(
bool enable);
00408
00413
bool blockingMode();
00414
00424
bool setAddressReusable(
bool enable);
00425
00430
bool addressReusable();
00431
00450
bool setIPv6Only(
bool enable);
00451
00458
bool isIPv6Only();
00459
00477 virtual
bool setBufferSize(
int rsize,
int wsize = -2);
00478
00484 const ::
KSocketAddress *localAddress();
00485
00492 const ::
KSocketAddress *peerAddress();
00493
00498 inline
int fd()
const
00499
{
return sockfd; }
00500
00501
00502
00503
00504
00512
virtual int lookup();
00513
00532
virtual int startAsyncLookup();
00533
00537
virtual void cancelAsyncLookup();
00538
00546
virtual int listen(
int N = 5);
00547
00562
virtual int accept(KExtendedSocket *&sock);
00563
00587
virtual int connect();
00588
00603
virtual int startAsyncConnect();
00604
00608
virtual void cancelAsyncConnect();
00609
00620
virtual bool open(
int mode = IO_Raw | IO_ReadWrite);
00621
00629
virtual void close();
00630
00636
virtual void closeNow();
00637
00651
virtual void release();
00652
00653
00654
00655
00656
00672
virtual void flush();
00673
00678
virtual inline Q_ULONG size()
const
00679
{
return 0; }
00680
00685
virtual inline Q_ULONG at()
const
00686
{
return 0; }
00687
00693
virtual inline bool at(
int i)
00694 { Q_UNUSED(i);
return true; }
00695
00701
virtual inline bool atEnd()
const
00702
{
return false; }
00703
00733
virtual Q_LONG readBlock(
char *data, Q_ULONG maxlen);
00734
00758
virtual Q_LONG writeBlock(
const char *data, Q_ULONG len);
00759
00774
virtual int peekBlock(
char *data, uint maxlen);
00775
00782
virtual int unreadBlock(
const char *data, uint len);
00783
00793
virtual int bytesAvailable() const;
00794
00804 virtual
int waitForMore(
int msec);
00805
00810 virtual
int getch();
00811
00817 virtual
int putch(
int ch);
00818
00823 virtual
int ungetch(
int)
00824 {
return -1; }
00825
00836
virtual void enableRead(
bool enable);
00837
00847
virtual void enableWrite(
bool enable);
00848
00849 signals:
00855
void lookupFinished(
int count);
00856
00860
void connectionSuccess();
00861
00867
void connectionFailed(
int error);
00868
00874
void readyAccept();
00875
00876
protected:
00877
int sockfd;
00878
00879
protected slots:
00880
00881
void socketActivityRead();
00882
void socketActivityWrite();
00883
void dnsResultsReady();
00884
void startAsyncConnectSlot();
00885
void connectionEvent();
00886
00887
protected:
00888
00889
QSocketNotifier *readNotifier();
00890
QSocketNotifier *writeNotifier();
00891
00892
private:
00893
00894
00895 KExtendedSocket(KExtendedSocket&);
00896 KExtendedSocket& operator=(KExtendedSocket&);
00897
00902
static int doLookup(
const QString& host,
const QString& serv, addrinfo& hint,
00903 kde_addrinfo** result);
00904
00905
protected:
00909
void setError(
int errorkind,
int error);
00910
00911
inline void cleanError()
00912 { setError(IO_Ok, 0); }
00913
00917
void setSocketStatus(
int status);
00918
00919
public:
00933
static int resolve(sockaddr* sock, ksocklen_t len,
QString& host,
QString& port,
int flags = 0) KDE_DEPRECATED;
00934
00947
static int resolve(::
KSocketAddress* sock,
QString& host,
QString& port,
int flags = 0) KDE_DEPRECATED;
00948
00969
static QPtrList<KAddressInfo> lookup(
const QString& host,
const QString& port,
int flags = 0,
int *error = 0) KDE_DEPRECATED;
00970
00977 static ::KSocketAddress *localAddress(
int fd) KDE_DEPRECATED;
00978
00986 static ::KSocketAddress *peerAddress(
int fd) KDE_DEPRECATED;
00987
00994
static QString strError(
int code,
int syserr);
00995
01005
static bool setAddressReusable(
int fd,
bool enable) KDE_DEPRECATED;
01006
01007
protected:
01008
virtual void virtual_hook(
int id,
void* data );
01009
private:
01010 KExtendedSocketPrivate *d;
01011
01012
friend class KSocket;
01013
friend class KServerSocket;
01014 };
01015
01022
class KDECORE_EXPORT KAddressInfo
01023 {
01024
private:
01025 addrinfo *ai;
01026 ::KSocketAddress *addr;
01027
01028
inline KAddressInfo() : ai(0), addr(0)
01029 { }
01030
01031
01032 KAddressInfo(KAddressInfo&) { }
01033 KAddressInfo& operator=(KAddressInfo&) {
return *
this; }
01034
01035
public:
01036 ~KAddressInfo();
01037
01042
inline KDE_DEPRECATED operator const ::KSocketAddress*()
const
01043
{
return addr; }
01044
01048
inline KDE_DEPRECATED operator const addrinfo&()
const
01049
{
return *ai; }
01050
01055
inline KDE_DEPRECATED operator const addrinfo*()
const
01056
{
return ai; }
01057
01063
inline KDE_DEPRECATED const ::KSocketAddress* address()
const
01064
{
return addr; }
01065
01070
int flags() const KDE_DEPRECATED;
01071
01076
int family() const KDE_DEPRECATED;
01077
01082
int socktype() const KDE_DEPRECATED;
01083
01088
int protocol() const KDE_DEPRECATED;
01089
01090
01096 const
char* canonname() const KDE_DEPRECATED;
01097
01102 inline
int length()
const
01103
{
if (addr)
return addr->size();
return 0; }
01104
01105
friend class KExtendedSocket;
01106 };
01107
01108
#endif //Q_OS_UNIX
01109
01110
#endif // KEXTSOCK_H