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 <sys/time.h>
00024
00025
#include <qstring.h>
00026
#include <qptrlist.h>
00027
#include <qiodevice.h>
00028
00029
#include "kbufferedio.h"
00030
#include "ksockaddr.h"
00031
00032
00033
struct addrinfo;
00034
struct kde_addrinfo;
00035
class KAddressInfo;
00036
class QSocketNotifier;
00037
00038
00039
00040
00041
00042
00043
00044
00045
#define IO_ListenError (IO_UnspecifiedError+1)
00046
#define IO_AcceptError (IO_UnspecifiedError+2)
00047
#define IO_LookupError (IO_UnspecifiedError+3)
00048
00049
class KExtendedSocketPrivate;
00083 class KExtendedSocket:
public KBufferedIO
00084 {
00085 Q_OBJECT
00086
00087
public:
00091 enum Flags
00092 {
00093
00094
00095
00096
00097
00098 anySocket = 0x00,
00099 knownSocket = 0x01,
00100 unixSocket = knownSocket | 0x02,
00101 inetSocket = knownSocket | 0x04,
00102 ipv4Socket = inetSocket | 0x100,
00103 ipv6Socket = inetSocket | 0x200,
00104
00105 passiveSocket = 0x1000,
00106 canonName = 0x2000,
00107 noResolve = 0x4000,
00108
00109 streamSocket = 0x8000,
00110 datagramSocket = 0x10000,
00111 rawSocket = 0x20000,
00112
00113 inputBufferedSocket = 0x200000,
00114 outputBufferedSocket = 0x400000,
00115 bufferedSocket = 0x600000
00116 };
00117
00123 enum SockStatus
00124 {
00125
00126 error = -1,
00127
00128 nothing = 0,
00129
00130 lookupInProgress = 50,
00131 lookupDone = 70,
00132
00133
00134 created = 100,
00135 bound = 140,
00136
00137 connecting = 200,
00138 connected = 220,
00139
00140 listening = 200,
00141 accepting = 220,
00142
00143 closing = 350,
00144
00145 done = 400
00146 };
00147
00148
public:
00152
KExtendedSocket();
00153
00160
KExtendedSocket(
const QString& host,
int port,
int flags = 0);
00161
00168
KExtendedSocket(
const QString& host,
const QString& service,
int flags = 0);
00169
00174
virtual ~KExtendedSocket();
00175
00181
void reset();
00182
00183
00184
00185
00186
00192
int socketStatus() const;
00193
00200
int systemError() const;
00201
00207
int setSocketFlags(
int flags);
00208
00214
int socketFlags() const;
00215
00221
bool setHost(const
QString& host);
00222
00227
QString host() const;
00228
00233
bool setPort(
int port);
00234
00240
bool setPort(const
QString& port);
00241
00246
QString port() const;
00247
00254
bool setAddress(const
QString& host,
int port);
00255
00262
bool setAddress(const
QString& host, const
QString& serv);
00263
00269
bool setBindHost(const
QString& host);
00270
00275
bool unsetBindHost();
00276
00281
QString bindHost() const;
00282
00288
bool setBindPort(
int port);
00289
00295
bool setBindPort(const
QString& service);
00296
00301
bool unsetBindPort();
00302
00307
QString bindPort() const;
00308
00316
bool setBindAddress(const
QString& host,
int port);
00317
00325
bool setBindAddress(const
QString& host, const
QString& service);
00326
00332
bool unsetBindAddress();
00333
00345
bool setTimeout(
int secs,
int usecs = 0);
00346
00351 timeval timeout() const;
00352
00361
bool setBlockingMode(
bool enable);
00362
00367
bool blockingMode();
00368
00378
bool setAddressReusable(
bool enable);
00379
00384
bool addressReusable();
00385
00404
bool setIPv6Only(
bool enable);
00405
00412
bool isIPv6Only();
00413
00431 virtual
bool setBufferSize(
int rsize,
int wsize = -2);
00432
00438 const
KSocketAddress *localAddress();
00439
00446 const
KSocketAddress *peerAddress();
00447
00452 inline
int fd()
const
00453
{
return sockfd; }
00454
00455
00456
00457
00458
00466
virtual int lookup();
00467
00486
virtual int startAsyncLookup();
00487
00491
virtual void cancelAsyncLookup();
00492
00500
virtual int listen(
int N = 5);
00501
00516
virtual int accept(
KExtendedSocket *&sock);
00517
00541
virtual int connect();
00542
00557
virtual int startAsyncConnect();
00558
00562
virtual void cancelAsyncConnect();
00563
00574
virtual bool open(
int mode = IO_Raw | IO_ReadWrite);
00575
00583
virtual void close();
00584
00590
virtual void closeNow();
00591
00605
virtual void release();
00606
00607
00608
00609
00610
00626
virtual void flush();
00627
00632 virtual inline Q_ULONG
size()
const
00633
{
return 0; }
00634
00639 virtual inline Q_ULONG
at()
const
00640
{
return 0; }
00641
00647 virtual inline bool at(
int i)
00648 { Q_UNUSED(i);
return true; }
00649
00655 virtual inline bool atEnd()
const
00656
{
return false; }
00657
00687
virtual Q_LONG readBlock(
char *data, Q_ULONG maxlen);
00688
00712
virtual Q_LONG writeBlock(
const char *data, Q_ULONG len);
00713
00728
virtual int peekBlock(
char *data, uint maxlen);
00729
00736
virtual int unreadBlock(
const char *data, uint len);
00737
00747
virtual int bytesAvailable() const;
00748
00758 virtual
int waitForMore(
int msec);
00759
00764 virtual
int getch();
00765
00771 virtual
int putch(
int ch);
00772
00777 virtual
int ungetch(
int)
00778 {
return -1; }
00779
00790
virtual void enableRead(
bool enable);
00791
00801
virtual void enableWrite(
bool enable);
00802
00803 signals:
00809
void lookupFinished(
int count);
00810
00814
void connectionSuccess();
00815
00821
void connectionFailed(
int error);
00822
00828
void readyAccept();
00829
00830
protected:
00831
int sockfd;
00832
00833
protected slots:
00834
00835
void socketActivityRead();
00836
void socketActivityWrite();
00837
void dnsResultsReady();
00838
void startAsyncConnectSlot();
00839
void connectionEvent();
00840
00841
protected:
00842
00843
QSocketNotifier *readNotifier();
00844
QSocketNotifier *writeNotifier();
00845
00846
private:
00847
00848
00849
KExtendedSocket(
KExtendedSocket&);
00850
KExtendedSocket& operator=(
KExtendedSocket&);
00851
00856
static int doLookup(
const QString& host,
const QString& serv, addrinfo& hint,
00857 kde_addrinfo** result);
00858
00859
protected:
00863
void setError(
int errorkind,
int error);
00864
00865
inline void cleanError()
00866 { setError(IO_Ok, 0); }
00867
00871
void setSocketStatus(
int status);
00872
00873
public:
00887
static int resolve(sockaddr* sock, ksocklen_t len,
QString& host,
QString& port,
int flags = 0);
00888
00901
static int resolve(
KSocketAddress* sock,
QString& host,
QString& port,
int flags = 0);
00902
00921
static QPtrList<KAddressInfo> lookup(
const QString& host,
const QString& port,
int flags = 0,
int *error = 0);
00922
00929
static KSocketAddress *
localAddress(
int fd);
00930
00938
static KSocketAddress *
peerAddress(
int fd);
00939
00946
static QString strError(
int code,
int syserr);
00947
00957
static bool setAddressReusable(
int fd,
bool enable);
00958
00959
protected:
00960
virtual void virtual_hook(
int id,
void* data );
00961
private:
00962 KExtendedSocketPrivate *d;
00963
00964
friend class KSocket;
00965
friend class KServerSocket;
00966 };
00967
00972 class KAddressInfo
00973 {
00974
private:
00975 addrinfo *ai;
00976
KSocketAddress *addr;
00977
00978
inline KAddressInfo() : ai(0), addr(0)
00979 { }
00980
00981
KAddressInfo(addrinfo *ai);
00982
KAddressInfo(
KAddressInfo&) { }
00983
KAddressInfo& operator=(
KAddressInfo&) {
return *
this; }
00984
00985
public:
00986 ~
KAddressInfo();
00987
00992 inline operator const KSocketAddress*()
const
00993
{
return addr; }
00994
00998 inline operator const addrinfo&()
const
00999
{
return *ai; }
01000
01005 inline operator const addrinfo*()
const
01006
{
return ai; }
01007
01013 inline const KSocketAddress*
address()
const
01014
{
return addr; }
01015
01020
int flags() const;
01021
01026
int family() const;
01027
01032
int socktype() const;
01033
01038
int protocol() const;
01039
01040
01046 const
char* canonname() const;
01047
01052 inline
int length()
const
01053
{
if (addr)
return addr->
size();
return 0; }
01054
01055
friend class KExtendedSocket;
01056 };
01057
01058
#endif // KEXTSOCK_H