#include <memory>
#include <cassert>
#include <cstring>
+#include <errno.h>
#include <simgear/debug/logstream.hxx>
-#include <simgear/io/HostLookup.hxx>
+
namespace simgear {
{
closed = true ;
connected = false ;
+ resolving_host = false;
accepting = false ;
write_blocked = false ;
should_delete = false ;
close () ;
Socket::setHandle ( handle ) ;
connected = is_connected ;
- //if ( connected ) this->handleConnect();
closed = false ;
}
}
int
-NetChannel::connect ( const char* host, int p )
+NetChannel::connect ( const char* h, int p )
{
- host_lookup = HostLookup::lookup(host);
+ host = h;
port = p;
- return 0;
+ resolving_host = true;
+ return handleResolve();
}
int
if (accepting) {
if (!connected) {
connected = true ;
- //this->handleConnect();
}
this->handleAccept();
} else if (!connected) {
connected = true ;
- //this->handleConnect();
this->handleRead();
} else {
this->handleRead();
{
if (!connected) {
connected = true ;
- //this->handleConnect();
}
write_blocked = false ;
this->handleWrite();
}
-void
-NetChannel::doConnect()
-{
- IPAddress addr( host_lookup->address() );
+int
+NetChannel::handleResolve()
+{
+ IPAddress addr;
+ if (!IPAddress::lookupNonblocking(host.c_str(), addr)) {
+ return 0; // not looked up yet, wait longer
+ }
+
+ resolving_host = false;
addr.setPort(port);
- int result = Socket::connect ( addr ) ;
- host_lookup = NULL;
-
+ int result = Socket::connect ( &addr ) ;
if (result == 0) {
connected = true ;
+ return 0;
} else if (isNonBlockingError ()) {
-
+ return 0;
} else {
- // some other error condition
+ // some other error condition
handleError (result);
close();
+ return -1;
}
}
}
else if ( ! ch -> closed )
{
- nopen++ ;
- if (ch->host_lookup) {
- if (ch->host_lookup->resolved()) {
- ch->doConnect();
- } else if (ch->host_lookup->failed()) {
- ch->handleError (-1);
- ch->close();
- }
+ if (ch -> resolving_host )
+ {
+ ch -> handleResolve();
continue;
}
+ nopen++ ;
if (ch -> readable()) {
assert(nreads<MAX_SOCKETS);
reads[nreads++] = ch ;