]> git.tdb.fi Git - libs/net.git/commitdiff
Add support for setting socket timeouts
authorMikko Rasa <tdb@tdb.fi>
Mon, 13 Dec 2010 11:09:52 +0000 (11:09 +0000)
committerMikko Rasa <tdb@tdb.fi>
Mon, 13 Dec 2010 11:09:52 +0000 (11:09 +0000)
source/socket.cpp
source/socket.h

index 6db6271a8a2710b01588a7ac9de4fa363cbe1727..49614df0c807bdf89f3d5772b3afb996b1bf0039 100644 (file)
@@ -144,6 +144,20 @@ void Socket::close()
        peer_addr=0;
 }
 
+void Socket::set_timeout(const Time::TimeDelta &timeout)
+{
+#ifndef WIN32
+       timeval tv;
+       timeout.fill_timeval(tv);
+       set_option(SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(timeval));
+       set_option(SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof(timeval));
+#else
+       DWORD msecs = static_cast<DWORD>(timeout/Time::msec);
+       set_option(SOL_SOCKET, SO_RCVTIMEO, &msecs, sizeof(DWORD));
+       set_option(SOL_SOCKET, SO_SNDTIMEO, &msecs, sizeof(DWORD));
+#endif
+}
+
 const SockAddr &Socket::get_local_address() const
 {
        if(local_addr==0)
@@ -166,7 +180,16 @@ void Socket::check_state(bool conn) const
                throw Exception("Socket is not connected");
 }
 
-int Socket::get_option(int level, int optname, void *optval, socklen_t *optlen)
+int Socket::set_option(int level, int optname, const void *optval, socklen_t optlen)
+{
+#ifdef WIN32
+       return setsockopt(handle, level, optname, reinterpret_cast<const char *>(optval), optlen);
+#else
+       return setsockopt(handle, level, optname, optval, optlen);
+#endif
+}
+
+int Socket::get_option(int level, int optname, void *optval, socklen_t *optlen) const
 {
 #ifdef WIN32
        return getsockopt(handle, level, optname, reinterpret_cast<char *>(optval), optlen);
index d807b7deda03faadfc0db80f7870cdc06a639579..db4206cb7546a5f84e7345035def471a3b09c0e5 100644 (file)
@@ -39,11 +39,13 @@ public:
        void bind(const SockAddr &);
        virtual int connect(const SockAddr &) =0;
        void close();
+       void set_timeout(const Time::TimeDelta &);
        const SockAddr &get_local_address() const;
        const SockAddr &get_peer_address() const;
 protected:
        void check_state(bool) const;
-       int get_option(int, int, void *, socklen_t *);
+       int set_option(int, int, const void *, socklen_t);
+       int get_option(int, int, void *, socklen_t *) const;
        unsigned do_write(const char *, unsigned);
        unsigned do_read(char *, unsigned);
 };