+ int connect()
+ {
+ return ::connect(mFd, mAddress.address(), mAddress.size());
+ }
+
+ int bind()
+ {
+ return ::bind(mFd, mAddress.address(), mAddress.size());
+ }
+
+ int listen(int backlog = SOMAXCONN)
+ {
+ return ::listen(mFd, backlog > 0 ? backlog : SOMAXCONN);
+ }
+
+ Socket accept()
+ {
+ return Socket(mFd);
+ }
+
+
+ int set(int option, int value = 0)
+ {
+ if (option == SO_NONBLOCK)
+ {
+#ifdef HAVE_FCNTL
+ int flags = fcntl(mFd, F_GETFL);
+ return fcntl(mFd, F_SETFL, (value ? O_NONBLOCK : 0) | flags);
+#else
+ return ioctl(mFd, FIONBIO, value);
+#endif
+ }
+ return setsockopt(mFd, SOL_SOCKET, option, &value, sizeof(value));
+ }
+
+ int set(int option, const std::string& value)
+ {
+ return setsockopt(mFd, SOL_SOCKET, option,
+ value.c_str(), value.length());
+ }
+
+ int get(int option, int& value)
+ {
+ if (option == SO_NONBLOCK)
+ {
+#ifdef HAVE_FCNTL
+ int flags = fcntl(mFd, F_GETFL);
+ return flags & O_NONBLOCK;
+#else
+ return ioctl(mFd, FIONBIO, &value);
+#endif
+ }
+ socklen_t optlen = sizeof(value);
+ return getsockopt(mFd, SOL_SOCKET, option, &value, &optlen);
+ }
+
+ int get(int option, std::string& value)
+ {
+ char str[64] = {'\0'};
+ socklen_t optlen = sizeof(str);
+ int result = getsockopt(mFd, SOL_SOCKET, option, &str, &optlen);
+ value = str;
+ return result;
+ }
+