2012-12-26 19 views
5

Czy istnieje crossoversplatform dusza do zaakceptowania klienta przy użyciu funkcji accept bez ustawienia gniazda na nieblokowanie?Jak zaakceptować gniazdo z limitem czasu

Wiem, że powinienem użyć funkcji select, ale co robię źle?

SOCKET NativesAcceptClient(SOCKET s, int timeout) 
{ 
    int iResult; 
    struct timeval tv; 
    fd_set rfds; 
    FD_ZERO(&rfds); 
    FD_SET(s, &rfds); 

    tv.tv_sec = (long)timeout; 
    tv.tv_usec = 0; 

    iResult = select(s, &rfds, (fd_set *) 0, (fd_set *) 0, &tv); 
    if(iResult > 0) 
    { 
     return accept(s, NULL, NULL); 
    } 
    else 
    { 
    //always here, even if i connect from another application 
    } 
    return 0; 
} 

Jak to naprawić? Dzięki!

+0

@ryanbwork nie, limit czasu to 10 – Boris

+0

Zobacz poniżej moje rozwiązanie? – ryanbwork

+1

czy od razu wyskoczył z zaznaczenia, czy czeka 10 s przed pojawieniem się (jeśli nie łączysz się z nim)? wygląda dobrze (poza wymienionym s + 1 dla platform innych niż Windows), coś jeszcze jest nie w porządku ... – mark

Odpowiedz

2

Pierwszy parametr wywołania select powinien być równy największemu deskryptorowi pliku liczb w zestawie fd_set plus 1 (patrz here). Spróbuj zmienić pierwszy argument na s+1; będziesz musiał dodać trochę logiki, gdy masz więcej niż jedno gniazdo w swoim zestawie.

+0

Dzięki, ale testuję teraz w systemie Windows, ponieważ wiem, że pierwszy parametr jest ignorowany w oknach – Boris

+0

Czy możesz upewnić się, że twoje połączenie przychodzące ma miejsce w twoim 10-sekundowym oknie? – ryanbwork

0

Pierwszy argument select() jest int, który jest co najmniej 1 większy niż najwyższa wartość deskryptorów plików w dowolnym zestawie bitów. W takim przypadku powinno zadziałać

iResult = select(s + 1, &rfds, (fd_set *) 0, (fd_set *) 0, &tv); 

.

1

select() zwraca> 0, jeśli gniazdo jest sygnalizowane, 0 po przekroczeniu limitu czasu i -1 w przypadku błędu. Jaką wartość naprawdę powraca do Ciebie? Sprawdzasz tylko> 0 i < = 0, co oznacza, że ​​nie rozróżniasz wartości od -1 do 0. Jeśli wraca 0, to żaden klient nie łączy się z twoim gniazdem, ale jeśli zwraca -1, to twoje gniazdo jest prawdopodobnie nie ważne na początek.

Powiązane problemy