diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/Socket.cc | 33 | 
1 files changed, 29 insertions, 4 deletions
| diff --git a/lib/Socket.cc b/lib/Socket.cc index f417bf9..97371a5 100644 --- a/lib/Socket.cc +++ b/lib/Socket.cc @@ -35,19 +35,19 @@ class dummy_win32_socket_class_t : public Base {  typedef int socklen_t;  #endif -Socket::Socket() throw (GeneralException) : Handle(socket(AF_INET, SOCK_STREAM, 0)), connected(false), listening(false), writeclosed(false), readclosed(false) { +Socket::Socket() throw (GeneralException) : Handle(socket(AF_INET, SOCK_STREAM, 0)), connected(false), listening(false), writeclosed(false), readclosed(false), connecting(false) {  //    cerr << "Socket(): connected = " << connected << "; readclosed = " << readclosed << "; writeclosed = " << writeclosed << endl;      if (GetHandle() < 0) {  	throw GeneralException(_("Error creating socket."));      }  } -Socket::Socket(const Socket & s) : Handle(s), connected(s.connected), listening(s.listening), writeclosed(s.writeclosed), readclosed(s.readclosed) { +Socket::Socket(const Socket & s) : Handle(s), connected(s.connected), listening(s.listening), writeclosed(s.writeclosed), readclosed(s.readclosed), connecting(s.connecting) {  //    cerr << "Constructing a socket by copy...\n";  //    cerr << "Socket(const Socket &): connected = " << connected << "; readclosed = " << readclosed << "; writeclosed = " << writeclosed << endl;  } -Socket::Socket(int h) : Handle(h), connected(true), listening(false), writeclosed(false), readclosed(false) { } +Socket::Socket(int h) : Handle(h), connected(true), listening(false), writeclosed(false), readclosed(false), connecting(false) { }  String Socket::GetName(void) {      return String("socket"); @@ -57,6 +57,10 @@ bool Socket::IsConnected(void) {      return connected;  } +bool Socket::IsConnecting(void) { +    return connecting; +} +  bool Socket::IsListening(void) {      return listening;  } @@ -139,7 +143,14 @@ bool Socket::Connect(const String & host, int port) {  //	    cerr << " - Connected." << endl;  	    connected = true;  	} else { -//	    cerr << " - Error connecting: " << strerror(errno) << endl; +//            std::cerr << " - Error connecting: " << strerror(errno) << std::endl; +#ifdef _WIN32 +            if (WSAGetLastError() == WSAEWOULDBLOCK) { +#else +            if (errno == EINPROGRESS) { +#endif +                connecting = true; +            }  	}      }      return connected; @@ -180,6 +191,20 @@ int Socket::GetPort() {      return r;  } +bool Socket::FinalizeConnect() { +    int r; +    socklen_t l = sizeof(r); + +    if (getsockopt(GetHandle(), SOL_SOCKET, SO_ERROR, (char *)&r, &l) == 0) { +        if (r == 0) { +            connected = true; +        } +    } +    connecting = false; + +    return connected; +} +  ssize_t Socket::nwrite(const void * buf, size_t count) throw (GeneralException) {      return ::send(GetHandle(), (const char *) buf, count, 0);  } | 
