Toon posts:

[Ansi C] Connect() met timeout implementeren?

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben een programma aan het maken op een master-node die periodiek zijn andere nodes moet afgaan om data te synchroniseren. Een soort rsync vanuit een centrale locatie. Alleen, die andere nodes kunnen best ook uit staan en dan blockt mijn connect() call (nouja, blockt.. hij wacht veel te lang op een timeout).

Nu probeer ik dat connecten wat sneller te laten gaan, dus eerder te laten time-outen. Aangezien connect hier zelf geen functies voor heeft, los ik dit op met een setjmp en alarm. Als dat alarm af gaat, kom ik via een longjmp terug en spring ik uit de functie (return -1 om een timeout aan te geven). Dit gaat 1x goed, daarna reageert hij niet meer op alarm calls.

Om het wat duidelijker te maken heb ik de relevante code gezet in http://www.noidea128.org/...rce.cgi?id=5998&type=html. Kan iemand mij vertellen wat ik fout doe?

Om het extra interessant te maken; dit zou moeten werken op linux dozen (werkt dus niet) maar uitstekend op een macosx machine! Hierin heb ik connect() rommel vervangen voor select() maar dat mag het verschil niet zijn.. Als ik mijn code niet alsnog moet omgooien naar non-blocking (om het dan met select() te omzeilen) zou dat top zijn!

Kan iemand me hiermee helpen? Alvast bedankt

Verwijderd

Topicstarter
Mocht iemand er iets aan hebben, ik heb het zelf net opgelost.. Zal je altijd zien, vraag je net hulp kom je er zelf achter.

In ieder geval, de functies setjmp en longjump in linux vernachelen je signals. Dus net vervelend. MacOSX heeft dit probleem zo te zien niet. Sigsetjmp(.. , SIGALRM) overkomt dit probleem door expliciet ook SIGALRM op te slaan. Voilla, werkt.

  • Onno
  • Registratie: Juni 1999
  • Niet online
Eh, werkt dit niet ook gewoon?

code:
1
2
3
4
5
6
7
alarm(2);
err = connect(...);
alarm(0);
if (err == -1 && errno == EINTR)
{
  // timeout!
}

En je kunt de ingebouwde timeout van connects ook ongetwijfeld aanpassen met een een setsockopt() call.

(ik vind zelf het gebruiken van non-blocking sockets een stuk netter trouwens)

[ Voor 16% gewijzigd door Onno op 24-11-2004 01:36 ]