00001
00002 #ifndef MPS_SocketDescriptor_H
00003 #define MPS_SocketDescriptor_H
00004
00005 #include <ref.h>
00006 #include <exception>
00007 #include <string>
00008 #include <map>
00009
00010 #include <FileDescriptor.h>
00011
00012 class SocketDescriptor;
00013 class ClientSocketDescriptor;
00014 class ServerSocketDescriptor;
00015
00016
00017
00018
00019 class SocketDescriptor: public FileDescriptor {
00020 private:
00021 string hostname_local;
00022 int port_local;
00023
00024 string hostname_remote;
00025 int port_remote;
00026
00027 protected:
00028
00029 virtual int lowlevel_read(int fd, char *buf, int len);
00030 virtual int lowlevel_write(int fd, char const *buf, int len);
00031
00032 #ifdef __WIN32__
00033 virtual int lowlevel_close(int fd);
00034 #endif
00035
00036 friend class ServerSocketDescriptor;
00037 SocketDescriptor(ref<FileDescriptorManager> const &_fdMgr, int _fd)
00038 : FileDescriptor(_fdMgr, _fd),
00039 hostname_local("UNKNOWN"),
00040 port_local(0),
00041 hostname_remote("UNKNOWN"),
00042 port_remote(0)
00043 {}
00044
00045 void setLocalAddr(string const &hostname, int port) {
00046 hostname_local = hostname;
00047 port_local = port;
00048 }
00049
00050 void setRemoteAddr(string const &hostname, int port) {
00051 hostname_remote = hostname;
00052 port_remote = port;
00053 }
00054
00055 public:
00056 virtual void close();
00057
00058
00059
00060
00061
00062
00063 string const &getLocalHostname() const { return hostname_local; }
00064 int getLocalPort() const { return port_local; }
00065 string const &getRemoteHostname() const { return hostname_remote; }
00066 int getRemotePort() const { return port_remote; }
00067
00068 };
00069
00070
00071
00072 class ClientSocketDescriptor: public SocketDescriptor {
00073 public:
00074
00075 ClientSocketDescriptor(ref<FileDescriptorManager> const &_fdMgr,
00076 string const &_hostname, int _port);
00077 };
00078
00079
00080
00081 class ServerSocketDescriptor: public SocketDescriptor {
00082 private:
00083 string canonicalAddress;
00084
00085 public:
00086
00087
00088
00089
00090
00091
00092 ServerSocketDescriptor(ref<FileDescriptorManager> const &_fdMgr,
00093 int _port = 0, string const &_hostname = "");
00094
00095
00096
00097
00098 ref<SocketDescriptor> accept();
00099
00100
00101 string const &getCanonicalAddress() const { return canonicalAddress; }
00102 };
00103
00104
00105
00106
00107 template <class ConnectionHandler> class SocketAcceptorCallback: public FileDescriptor::Callback {
00108 private:
00109 void acceptHandler(ref<FileDescriptor> const &desc) {
00110 ref<ServerSocketDescriptor> server = (ServerSocketDescriptor *) desc.get();
00111 ref<Referenceable> dummyRef = new ConnectionHandler(server->accept());
00112 }
00113
00114 public:
00115 SocketAcceptorCallback(ref<ServerSocketDescriptor> const &server) {
00116 server->setReadCallback(this,
00117 (FileDescriptor::Callback::Method)
00118 &SocketAcceptorCallback::acceptHandler);
00119 }
00120 };
00121
00122 #endif