00001
00002
00003
00004
00005
00006
00007 #ifndef __WVTCP_H
00008 #define __WVTCP_H
00009
00010 #include "wvautoconf.h"
00011 #include <stdio.h>
00012 #if HAVE_SYS_TYPES_H
00013 # include <sys/types.h>
00014 #endif
00015 #if STDC_HEADERS
00016 # include <stdlib.h>
00017 # include <stddef.h>
00018 #else
00019 # if HAVE_STDLIB_H
00020 # include <stdlib.h>
00021 # endif
00022 #endif
00023 #if HAVE_SYS_SOCKET_H
00024 # include <sys/socket.h>
00025 #endif
00026
00027 #include "wvfdstream.h"
00028 #include "wvaddr.h"
00029 #include "wvresolver.h"
00030
00031
00032 class WvIStreamList;
00033 class WvTCPListener;
00034
00040 class WvTCPConn : public WvFDStream
00041 {
00042 friend class WvTCPListener;
00043 protected:
00044 bool resolved, connected;
00045 WvString hostname;
00046 bool incoming;
00047 WvIPPortAddr remaddr;
00048 WvResolver dns;
00049
00051 WvTCPConn(int _fd, const WvIPPortAddr &_remaddr);
00052
00054 void do_connect();
00055
00057 void check_resolver();
00058
00059 public:
00065 WvTCPConn(const WvIPPortAddr &_remaddr);
00066
00068 WvTCPConn(WvStringParm _hostname, uint16_t _port = 0);
00069
00074 virtual ~WvTCPConn();
00075
00080 void nice_tcpopts();
00081
00086 void low_delay();
00087
00092 void debug_mode();
00093
00099 WvIPPortAddr localaddr();
00100
00105 virtual const WvIPPortAddr *src() const;
00106
00108 bool isconnected() const
00109 { return connected; }
00110
00112 virtual bool pre_select(SelectInfo &si);
00113
00118 virtual bool post_select(SelectInfo &si);
00119
00124 virtual bool isok() const;
00125
00126 protected:
00127 virtual size_t uwrite(const void *buf, size_t count);
00128
00129 public:
00130 const char *wstype() const { return "WvTCPConn"; }
00131 };
00132
00134 class WvTCPListener : public WvFDStream
00135 {
00136 public:
00141 WvTCPListener(const WvIPPortAddr &_listenport);
00142
00144 virtual ~WvTCPListener();
00145
00147 virtual void close();
00148
00155 WvTCPConn *accept();
00156
00166 void auto_accept(WvIStreamList *list,
00167 WvStreamCallback callfunc = NULL, void *userdata = NULL);
00168
00178 void auto_accept(WvStreamCallback callfunc = NULL, void *userdata = NULL);
00179
00184 virtual size_t uread(void *buf, size_t len);
00185 virtual size_t uwrite(const void *buf, size_t len);
00186
00188 virtual const WvIPPortAddr *src() const;
00189
00190 protected:
00191 WvIPPortAddr listenport;
00192 WvIStreamList *auto_list;
00193 WvStreamCallback auto_callback;
00194 void *auto_userdata;
00195
00196 static void accept_callback(WvStream &s, void *userdata);
00197 static void accept_global_callback(WvStream &s, void *userdata);
00198
00199 public:
00200 const char *wstype() const { return "WvTCPListener"; }
00201 };
00202
00203
00204 #endif // __WVTCP_H