+ int connect()
+ {
+ if (mFd == -1) mFd = socket(mAddress.family(), mAddress.type(), 0);
+ int result = ::connect(mFd, mAddress.address(), mAddress.size());
+ mIsConnected = result != -1;
+ return result;
+ }
+
+ int bind()
+ {
+ if (mFd == -1) mFd = socket(mAddress.family(), mAddress.type(), 0);
+ return ::bind(mFd, mAddress.address(), mAddress.size());
+ }
+
+ int listen(int backlog = SOMAXCONN)
+ {
+ return ::listen(mFd, backlog > 0 ? backlog : SOMAXCONN);
+ }
+
+ int accept(Socket& socket)
+ {
+ Socket temp = Socket(mFd);
+ if (temp.mFd != -1)
+ {
+ socket = temp;
+ return socket.mFd;
+ }
+ return -1;
+ }
+
+
+ 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.data(), 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)