In entrambi i casi, l'approccio più classico è usare socket non bloccanti in combinazione con la syscall select.
Crei il socket, lo imposti come non bloccante con una fcntl, chiami la connect; questa restituisce immediatamente anche se il socket non è ancora stato collegato. A questo punto, chiami la select passandole il fd del socket (come fd su cui attendere in scrittura) e il timeout; questa aspetta che il socket venga collegato o che trascorra il timeout. In base al valore restituito vedi se si è connesso oppure è scaduto il timeout. Stesso discorso per le read.
Consiglio: leggiti attentamente la manpage di select e cerca in giro indicazioni sull'IO non bloccante su sistemi Unix.