From: Christian P. <cp...@us...> - 2005-01-26 10:23:26
|
Update of /cvsroot/pclasses/pclasses2/src/Net In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv24824/src/Net Modified Files: Socket.cpp Log Message: Added export-macros. Added "static int Socket::wait()" for waiting on a number of sockets. Index: Socket.cpp =================================================================== RCS file: /cvsroot/pclasses/pclasses2/src/Net/Socket.cpp,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- Socket.cpp 24 Jan 2005 23:00:39 -0000 1.6 +++ Socket.cpp 26 Jan 2005 10:23:17 -0000 1.7 @@ -304,26 +304,37 @@ return ret; } -int Socket::wait(int wait, unsigned int timeout) throw(IO::IOError) +int Socket::wait(int wf, unsigned int timeout) throw(IO::IOError) +{ + Socket* s[] = { this }; + int w[] = { wf }; + int ret = wait(s, w, 1, timeout); + if(ret != 1) + return 0; + + return w[0]; +} + +int Socket::wait(Socket* s[], int wait[], int num, unsigned int timeout) + throw(IO::IOError) { fd_set readFds, writeFds; + FD_ZERO(&readFds); + FD_ZERO(&writeFds); - if(wait & WaitInput) + for(int i = 0; i < num; ++i) { - FD_ZERO(&readFds); - FD_SET(_handle, &readFds); - } + if(wait[i] & WaitInput) + FD_SET(s[i]->handle(), &readFds); - if(wait & WaitOutput) - { - FD_ZERO(&writeFds); - FD_SET(_handle, &writeFds); + if(wait[i] & WaitOutput) + FD_SET(s[i]->handle(), &writeFds); } struct timeval timeVal; select_loop: - int ret = ::select(_handle + 1, &readFds, &writeFds, 0, + int ret = ::select(num + 1, &readFds, &writeFds, 0, get_timeout(&timeVal, timeout, TIMEOUT_RELATIVE)); if(ret == -1) @@ -334,15 +345,29 @@ throw IO::IOError(errno, "Could not write to socket", P_SOURCEINFO); } - ret = 0; - - if(wait & WaitInput && FD_ISSET(_handle, &readFds)) - ret |= WaitInput; + int numReady = 0; + for(int i = 0; i < num; ++i) + { + wait[i] = 0; + int r = 0; + + if(FD_ISSET(s[i]->handle(), &readFds)) + { + wait[i] |= WaitInput; + ++r; + } + + if(FD_ISSET(s[i]->handle(), &writeFds)) + { + wait[i] |= WaitOutput; + ++r; + } - if(wait & WaitOutput && FD_ISSET(_handle, &writeFds)) - ret |= WaitOutput; + if(r > 0) + ++numReady; + } - return ret; + return numReady; } void Socket::bind(const NetworkAddress& addr, port_t port) throw(IO::IOError) @@ -369,24 +394,6 @@ throw IO::IOError(errno, "Could not connect socket", P_SOURCEINFO); } -void Socket::listen() throw(IO::IOError) -{ - int ret = ::listen(_handle, 128); - if(ret == -1) - throw IO::IOError(errno, "Could not listen on socket", P_SOURCEINFO); -} - -Socket Socket::accept() throw(IO::IOError) -{ - int ret = ::accept(_handle, 0, 0); - if(ret == -1) - throw IO::IOError(errno, "Could not accept connection on socket", P_SOURCEINFO); - - Socket s; - s.open(ret, _domain, _type, _proto); - return s; -} - void Socket::setSendTimeout(unsigned int timeout) throw(IO::IOError) { SocketOption<SOL_SOCKET, SO_SNDTIMEO, int> opt(_handle); @@ -456,18 +463,6 @@ return _handle; } -void Socket::addListener(IO::IOListener& l) -{ -} - -void Socket::updateListener(IO::IOListener& l) -{ -} - -void Socket::removeListener(IO::IOListener& l) -{ -} - DatagramSocket::DatagramSocket() throw() : Socket() @@ -495,10 +490,88 @@ { } +StreamSocket::StreamSocket(StreamSocketServer& srv) throw(IO::IOError) +: Socket() +{ + open(srv); +} + StreamSocket::~StreamSocket() throw() { } +void StreamSocket::open(StreamSocketServer& srv) throw(IO::IOError) +{ + Socket::open(srv.accept(), srv.domain(), srv.type(), srv.protocol()); +} + +StreamSocketServer::StreamSocketServer(Domain domain, int proto) throw(IO::IOError) +: Socket(domain, Socket::Stream, proto) +{ +} + +StreamSocketServer::StreamSocketServer(const NetworkAddress& addr, port_t port) + throw(IO::IOError) +: Socket(addrFamily2Domain(addr.family()), Socket::Stream, 0) +{ + bind(addr, port); +} + +StreamSocketServer::~StreamSocketServer() throw() +{ +} + +void StreamSocketServer::bind(const NetworkAddress& addr, port_t port) + throw(IO::IOError) +{ + Socket::bind(addr, port); +} + +bool StreamSocketServer::wait(unsigned int timeout) throw(IO::IOError) +{ + bool ret = Socket::wait(WaitOutput, timeout) & WaitOutput ? true : false; + return ret; +} + +void StreamSocketServer::listen() throw(IO::IOError) +{ + int ret = ::listen(handle(), 128); + if(ret == -1) + throw IO::IOError(errno, "Could not listen on socket", P_SOURCEINFO); +} + +int StreamSocketServer::accept() throw(IO::IOError) +{ + int ret = ::accept(handle(), 0, 0); + if(ret == -1) + throw IO::IOError(errno, "Could not accept connection on socket", P_SOURCEINFO); + + return ret; +} + +Socket::Domain Socket::addrFamily2Domain(int family) +{ + Socket::Domain d; + switch(family) + { + case AF_INET: + d = Socket::Inet; + break; + case AF_INET6: + d = Socket::Inet6; + break; + case AF_IPX: + d = Socket::IPX; + break; + case AF_APPLETALK: + d = Socket::AppleTalk; + break; + default: + throw; + } + + return d; +} } // !namespace Net |