+ mAddress(address) {}
+
+ Socket(const std::string& service, const std::string& name,
+ int type = SOCK_STREAM, int family = AF_UNSPEC) :
+ mFd(-1),
+ mIsConnected(false),
+ mAddress(SocketAddress(service, name, type, family)) {}
+
+ Socket(const std::string& service,
+ int type = SOCK_STREAM, int family = AF_UNSPEC) :
+ mFd(-1),
+ mIsConnected(false),
+ mAddress(SocketAddress(service, type, family)) {}
+
+
+ Socket(Socket& move) :
+ mFd(move.mFd),
+ mIsConnected(move.mIsConnected),
+ mAddress(move.mAddress)
+ {
+ move.mFd = -1;
+ move.mIsConnected = false;
+ }
+
+ Socket(Impl move) :
+ mFd(move.fd),
+ mIsConnected(move.isConnected),
+ mAddress(move.address) {}
+
+ Socket& operator=(Socket& move)
+ {
+#if defined(_WIN32)
+ if (mFd != -1) closesocket(mFd);
+#else
+ if (mFd != -1) close(mFd);
+#endif
+ mFd = move.mFd;
+ mIsConnected = move.mIsConnected;
+ mAddress = move.mAddress;
+ move.mFd = -1;
+ move.mIsConnected = false;
+ return *this;
+ }
+
+ Socket& operator=(Impl move)
+ {
+#if defined(_WIN32)
+ if (mFd != -1) closesocket(mFd);
+#else
+ if (mFd != -1) close(mFd);
+#endif
+ mFd = move.fd;
+ mIsConnected = move.isConnected;
+ mAddress = move.address;
+ return *this;
+ }
+
+ operator Impl()