2012-04-01 10 views
2

Mein Programm akzeptiert bis zu 4 Verbindungen (mit Auswahlfunktion). Sobald sie verbunden sind, haben sie 5 Sekunden Zeit, um eine Zeichenfolge zu senden, die anzeigt, dass sie verbunden bleiben möchten. Diejenigen, die nicht innerhalb von 5 Sekunden senden oder einen falschen Passcode haben, werden getrennt.Timeouts für Verbindungen in C

Ich habe ein kleines Timer-Programm erstellt, das gegabelt wird, sobald eine Verbindung hergestellt wird. Der gegabelte Timer gibt ein Signal an das ursprüngliche Programm zurück, wenn 5 Sekunden vergangen sind. In diesem Fall schließt der Signalhandler den Dateideskriptor und löscht die Verbindung.

Mein Problem ist, dass, wenn der Signalhandler ausgelöst wird, select() -1 zurückgibt, was anzeigt, dass es fehlgeschlagen ist. Weiß jemand, warum das passiert? Oder wenn es einen anderen Zeitmechanismus gibt, den ich benutzen könnte?

Dank

+1

Was ist errno wenn Auswahl -1 zurückgibt? Das ist dein größter Hinweis. – Duck

Antwort

0

Ich glaube, das ist das beabsichtigte Verhalten von select(): zurück -1 mit errno richtig eingestellt, wenn ein Signal auftritt.

Ich glaube nicht, dass Threads der Weg sind, hier zu gehen. Ich nehme an, Sie ein Programm mit etwa dieser Struktur wollen (verzeihen Sie die Java-artige Namensgebung, aber Sie erhalten den Punkt):

int fdsThatResponded[FDCOUNT]; 
memset(fdsThatResponded, 0, sizeof(int)*FDCOUNT); 

while (time_elapsed < 5) { 
    ret = select(......); 
    if (-1 == ret) { 
     handleError(); 
    } 
    checkWhichFdAndHandleAppropriately(); 
    reinitializeTimerForSelectWithRemainingTime(); 
} 

diese Hilfe überhaupt nicht?

1

Statt einen nutzlosen Faden Laichen, hält nur ein lastRecvd Feld mit jedem Socket zugeordnet ist. Geben Sie dann select() ein Timeout von 5 Sekunden. Nach der Auswahl eines Sockels, der nicht in der Auswahlliste enthalten ist, müssen Sie überprüfen, ob 5 Sekunden vergangen sind.

Warum es mit Ihrem aktuellen Code fehlschlägt, vermute ich, dass es ist, weil einer der Dateideskriptoren ungültig ist. Überprüfen Sie errno und sehen Sie, ob es EBADF ist.