2013-01-17 16 views
47

Co może spowodować błąd Resource temporarily unavailable dla polecenia gniazda send()? Gniazdo jest skonfigurowane jako AF_UNIX, SOCK_STREAM. Działa przez większość czasu, ale czasami pojawia się ten błąd. Odbierający koniec gniazda wydaje się działać poprawnie.Co może spowodować "Zasób tymczasowo niedostępny" dla polecenia send send()

Wiem, że to nie jest bardzo szczegółowe, ale ja po prostu szukam ogólnych pomysłów. Dzięki!

+0

Czy to jest powiązane? http://stackoverflow.com/questions/5737493/sendto-resource-temporalnie-unavailable-errno-11 – paddy

+2

Czy ustawiasz gniazdo na O_NONBLOCK? –

+0

Nie sądzę, że jest to związane z tym postem. Moje gniazda to SOCK_STREAM, które, jak sądzę, blokują to, czego chcę. – giroy

Odpowiedz

59

"Resource temporarily unavailable" to komunikat o błędzie odpowiadający EAGAIN, co oznacza, że ​​operacja zostałaby zablokowana, ale żądano operacji niezablokowanej. Dla send(), które mogą być ze względu na którąkolwiek:

  • wyraźnie zaznaczonych deskryptor pliku jako powodują blokowania z fcntl(); lub
  • przekazywanie flagi MSG_DONTWAIT do send(); lub
  • ustawianie limitu czasu wysyłania za pomocą opcji gniazda SO_SNDTIMEO.
+0

Przyczyną mojego problemu było ustawienie limitu czasu wysyłania. Dziękuję ci za pomoc! – giroy

+0

@ canf, W moim przypadku, różna konfiguracja rozmiaru MTU z dwóch stron powodowała, że ​​powiązanie sctp Txqueue było przepełnione, gdy zachodziła wysoka szybkość wymiany pakietów. Utworzenie jednostki MTU w obu systemach spowodowało, że problem zniknął. Ale czy ktoś może wyjaśnić, co jest przyczyną problemu? –

30

Dzieje się tak, ponieważ używasz gniazda non-blocking, a bufor wyjściowy jest pełny.

Od strony send() człowieka

When the message does not fit into the send buffer of the socket, 
    send() normally blocks, unless the socket has been placed in non-block- 
    ing I/O mode. In non-blocking mode it would return EAGAIN in this 
    case. 

EAGAIN jest kod błędu związany "Zasoby chwilowo niedostępny"

Rozważ użycie select() aby uzyskać lepszą kontrolę nad tym zachowań

+0

Ta odpowiedź była również bardzo pomocna. Dzięki! – giroy

Powiązane problemy