Narzędzia użytkownika

Narzędzia witryny


sk2:sockets_caveats

Różnice

Różnice między wybraną wersją a wersją aktualną.

Odnośnik do tego porównania

Both sides previous revision Poprzednia wersja
Nowa wersja Both sides next revision
sk2:sockets_caveats [2023/10/17 12:20]
jkonczak [Funkcje blokujące / nieblokujące]
sk2:sockets_caveats [2023/10/17 12:35]
jkonczak [Funkcje blokujące / nieblokujące]
Linia 47: Linia 47:
  
 Można zmienić domyśle blokujące zachowanie przestawiając gniazdo w //tryb nieblokujący//​. Można zmienić domyśle blokujące zachowanie przestawiając gniazdo w //tryb nieblokujący//​.
-Jeśli wykonanie żądanej funkcji na gnieździe w trybie nieblokującym nie jest możliwe bez czekania, to wykonanie funkcji nie powodzi się (zwracany jest wynik ''​-1''​) a zmienna ''​errno''​ jest ustawiana na ''​EAGAIN''​ lub ''​EWOULDBLOCK''​((Wyjątkiem jest funkcja ''​connect'',​ która rozpoczyna nawiązywanie połączenia w tle, zwraca ''​-1''​ i ustawia ''​errno''​ na ''​EINPROGRESS''​.)). Gniazdo przestawia się w tryb nieblokujący podobnie jak każdy inny deskryptor pliku:<​code cpp>​fcntl(fd,​ F_SETFL, fcntl(fd, F_GETFL) | O_NONBLOCK)</​code>​ +Jeśli wykonanie żądanej funkcji na gnieździe w trybie nieblokującym nie jest możliwe bez czekania, to wykonanie funkcji nie powodzi się (zwracany jest wynik ''​-1''​) a zmienna ''​errno''​ jest ustawiana na ''​EAGAIN''​ lub ''​EWOULDBLOCK''​((Wyjątkiem jest funkcja ''​connect'',​ która rozpoczyna nawiązywanie połączenia w tle, zwraca ''​-1''​ i ustawia ''​errno''​ na ''​EINPROGRESS''​.)). ​\\ Gniazdo przestawia się w tryb nieblokujący podobnie jak każdy inny deskryptor pliku: 
-Niektóre funkcje sieciowe (np. ''​recv'',​ ''​send''​) pozwalają na ustawienie w polu flag wartości ''​MSG_DONTWAIT'',​ która wykonuje żądaną operację w trybie nieblokującym niezależnie od tego w jakim trybie pracuje gniazdo:<​code cpp>​recv(fileDescriptor,​ buff, buffSize, MSG_DONTWAIT);</​code>​+<​html><​div style="​margin:​-1.4em 0 -1.4em 0"></​html>​ 
 +<code cpp>​fcntl(fd,​ F_SETFL, fcntl(fd, F_GETFL) | O_NONBLOCK)</​code
 +<​html></​div></​html
 +Niektóre funkcje sieciowe (np. ''​recv'',​ ''​send''​) pozwalają na ustawienie w polu flag wartości ''​MSG_DONTWAIT'',​ która wykonuje żądaną operację w trybie nieblokującym niezależnie od tego w jakim trybie pracuje gniazdo: 
 +<​html><​div style="​margin-top:​-1.4em"></​html>​ 
 +<code cpp>​recv(fileDescriptor,​ buff, buffSize, MSG_DONTWAIT);</​code>​ 
 +<​html></​div></​html>​ 
 +Uwaga: w BSD/POSIX socket API każde nowo utworzone gniazdo działa w trybie blokującym,​ nawet jeżeli gniazdo zostało utworzone w wyniku działania funkcji ''​accept''​ na nasłuchującym gnieździe działającym w trybie nieblokującym. ​  
  
 +<​small>​
 +W Linuksie można ustawiać tryb nieblokujący wykorzystując też niebędące częścią standardu POSIX rozszerzenia:​ 1) jeżeli ostatni argument funkcji ''​socket''​ będzie zsumowany z ''​SOCK_NONBLOCK'',​ to nowo stworzone gniazdo będzie w trybie nieblokującym (''​[[https://​man7.org/​linux/​man-pages/​man2/​socket.2.html|man 2 socket]]''​),​ 2) jeżeli zamiast funkcji ''​accept''​ wykorzysta się odpowiednik tej funkcji rozszerzony o pole flag – ''​accept4''​ – i poda flagę ''​SOCK_NONBLOCK''​ (''​[[https://​man7.org/​linux/​man-pages/​man2/​accept4.2.html|man 2 accept4]]''​)
 +</​small>​
 ==== Zadania ===== ==== Zadania =====
  
sk2/sockets_caveats.txt · ostatnio zmienione: 2023/10/17 12:45 przez jkonczak