User Tools

Site Tools


sk2:sockets_caveats

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
sk2:sockets_caveats [2024/10/31 10:42] – [Funkcje blokujące / nieblokujące] jkonczaksk2:sockets_caveats [2026/10/22 17:47] (current) – jkonczak
Line 41: Line 41:
  
 ===== Blokowanie i wartości zwracane przez funkcje odbierające / wysyłające dane  ===== ===== Blokowanie i wartości zwracane przez funkcje odbierające / wysyłające dane  =====
-==== Read i Write - ilość odczytanych / zapisanych bajtów  ==== 
- 
-Funkcje ''read'', ''recv'',… często zwracają mniej niż podana w argumentach 
-wielkość bufora. Powód? Mniej danych przyszło lub skończyło się miejsce w buforze 
-odbiorczym((Rozmiar bufora odbiorczego można ustawić funkcją: ''setsockopt(socket, SOL_SOCKET, SO_RCVBUF, …)'')). 
-Może się tak stać nawet pomimo ustawienia flagi ''MSG_WAITALL'' w funkcji 
-''recv'' i podobnych (żądającej odebrania dokładnie tylu bajtów ile podano), 
-np. w przypadku zakończenia połączenia. 
- 
-Funkcje ''write'', ''send'',… mogą też w pewnych okolicznościach wysłać mniejszą 
-ilość bajtów niż zażądano. 
-Jest to spowodowane zapełnieniem systemowego buforu wysyłania (czyli jeśli dane 
-są dostarczane do wysłania szybciej niż można je wysyłać). 
-Normalnie funkcje zapisujące blokują się do momentu aż w buforze będzie dość 
-miejsca. 
-Jeśli jednak gniazdo pracuje w trybie nieblokującym (patrz niżej), to funkcje 
-takie jak ''write'', ''send'', … zapiszą tylko część danych jeśli w buforze 
-systemowym skończy się miejsce. 
- 
-Dlatego zarówno przy odbieraniu jak i wysyłaniu trzeba sprawdzać zwracaną ilość 
-przetworzonych danych. 
  
 ==== Funkcje blokujące / nieblokujące ===== ==== Funkcje blokujące / nieblokujące =====
Line 112: Line 91:
 Linux od dawna wspiera stałą ''SOCK_NONBLOCK''. Linux od dawna wspiera stałą ''SOCK_NONBLOCK''.
 </small> </small>
 +
 +==== Read i Write - ilość odczytanych / zapisanych bajtów  ====
 +
 +Funkcje ''read'', ''recv'',… często zwracają mniej niż podana w argumentach
 +wielkość bufora. Powód? Mniej danych przyszło lub skończyło się miejsce w buforze
 +odbiorczym((Rozmiar bufora odbiorczego można ustawić funkcją: ''setsockopt(socket, SOL_SOCKET, SO_RCVBUF, …)'')).
 +Może się tak stać nawet pomimo ustawienia flagi ''MSG_WAITALL'' w funkcji
 +''recv'' i podobnych (żądającej odebrania dokładnie tylu bajtów ile podano),
 +np. w przypadku zakończenia połączenia.
 +
 +Funkcje ''write'', ''send'',… mogą też w pewnych okolicznościach wysłać mniejszą
 +ilość bajtów niż zażądano.
 +Jest to spowodowane zapełnieniem systemowego buforu wysyłania (czyli jeśli dane
 +są dostarczane do wysłania szybciej niż można je wysyłać).
 +Normalnie funkcje zapisujące blokują się do momentu aż w buforze będzie dość
 +miejsca.
 +Jeśli jednak gniazdo pracuje w trybie nieblokującym (patrz niżej), to funkcje
 +takie jak ''write'', ''send'', … zapiszą tylko część danych jeśli w buforze
 +systemowym skończy się miejsce.
 +
 +Dlatego zarówno przy odbieraniu jak i wysyłaniu trzeba sprawdzać zwracaną ilość
 +przetworzonych danych.
 +
 ==== Zadania ===== ==== Zadania =====
  
sk2/sockets_caveats.txt · Last modified: by jkonczak