public void Connect ()
{
/* If result.EndPoint is non-null,
* this is the standard one-address
* connect attempt. Otherwise
* Addresses must be non-null and
* contain a list of addresses to try
* to connect to; the first one to
* succeed causes the rest of the list
* to be ignored.
*/
if (result.EndPoint != null) {
try {
if (!result.Sock.Blocking) {
int success;
result.Sock.Poll (-1, SelectMode.SelectWrite, out success);
if (success == 0) {
result.Sock.seed_endpoint = result.EndPoint;
result.Sock.connected = true;
} else {
result.Complete (new SocketException (success));
return;
}
} else {
result.Sock.seed_endpoint = result.EndPoint;
result.Sock.Connect (result.EndPoint);
result.Sock.connected = true;
}
} catch (Exception e) {
result.Complete (e);
return;
}
result.Complete ();
} else if (result.Addresses != null) {
int error = (int) SocketError.InProgress; // why?
foreach(IPAddress address in result.Addresses) {
IPEndPoint iep = new IPEndPoint (address, result.Port);
SocketAddress serial = iep.Serialize ();
Socket.Connect_internal (result.Sock.socket, serial, out error);
if (error == 0) {
result.Sock.connected = true;
result.Sock.seed_endpoint = iep;
result.Complete ();
return;
} else if (error != (int)SocketError.InProgress &&
error != (int)SocketError.WouldBlock) {
continue;
}
if (!result.Sock.Blocking) {
int success;
result.Sock.Poll (-1, SelectMode.SelectWrite, out success);
if (success == 0) {
result.Sock.connected = true;
result.Sock.seed_endpoint = iep;
result.Complete ();
return;
}
}
}
result.Complete (new SocketException (error));
} else {
result.Complete (new SocketException ((int)SocketError.AddressNotAvailable));
}
}