2012-01-15 14 views
8

Kiedy gniazdo sygnalizowane jest jako prawidłowe, aby pisać przez połączenie z numerem select(), w jaki sposób mogę sprawdzić, ile danych mogę wysyłać bez blokowania? (W przypadku buforów pełnego wysyłania itp.)Czy send() kiedykolwiek blokuje podczas używania select()?

Czy uwzględnienie w zestawie zwróconym przez select() oznacza, że ​​gniazdo jest gotowe na co najmniej jeden bajt danych, a następnie zwróci krótką liczbę zapisanych bajtów?

A może będzie blokować, gdy zadzwonię pod numer send() z parametrem len, który jest większy niż dostępny obszar bufora? Jeśli tak, to w jaki sposób mogę poznać maksymalną kwotę?

Używam zwykłych gniazd C w systemie Linux.

+1

Jeśli twoje API obsługuje to, możesz użyć opcji 'SO_SNDLOWAT'. W ten sposób możesz wybrać minimalną liczbę bajtów, które muszą być zapisywalne. – cnicutar

Odpowiedz

5

Wywołanie nie powinno blokować przy pierwszym połączeniu i powinno wysyłać co najmniej jeden bajt przy pierwszym połączeniu - zakładając, że używasz protokołu strumieniowego i zakładając, że nie jest przerwany przez sygnał itp. naprawdę tylko dwa sposoby, aby dowiedzieć się, ile danych można przesłać:

  1. połączenia select po każdym wywołaniu send aby zobaczyć czy więcej danych może zostać wysłana.

  2. Umieść gniazdo w trybie bez blokady i zadzwoń pod numer send, aż pojawi się błąd EAGAIN lub EWOULDBLOCK.

Druga opcja jest preferowana. (Trzecią opcją jest zrobić to w innym wątku i po prostu pozwolić na blok wątku, który jest również dobrym rozwiązaniem. W przeszłości implementacje wątków nie były tak dojrzałe, więc tryb bez blokowania był postrzegany jako niezbędny do uzyskania wysokiej wydajności serwery.)

+0

+1 dla drugiej opcji, która również jest bardzo częstą praktyką. –

+0

Dlaczego 2 jest preferowane? Myślę, że wyjaśnienie lub odniesienie znacznie poprawiłoby tę odpowiedź. Czy nie możesz zrobić obu? –

4

Nie możesz wiedzieć. Musisz wysłać gniazdo, aby nie było blokady, a następnie zwrócić uwagę na wartość zwracaną, która mówi, ile napisała.

Powiązane problemy