wątku. W przypadku tej pracy uniemożliwiałoby to zatrzymanie programu przez użytkownika.
2.3.2. Gniazda nieblokujące
W celu przeciwdziałania wadom gniazd blokujących można skorzystać z gniazd nie-blokujących. Python udostępnia wiele mechanizmów do obsługi zarówno blokujących jak i nieblokujących gniazd. W tej pracy wykorzystane zostały dwa.
Pierwszym sposobem jest skorzystanie z metody setblocking(). Przykład:
sock = socket.socket(socket.af_inet, socket.sock_dgram) sock.bind((ip,port)) sock.setblocki ng(0)
W powyższym przypadku wywołanie metody recvfrom() w przypadku, gdy w buforze będą znajdowały się dane do odczytania da taki sam efekt jak w przypadku gniazd blokujących. Jednak w przypadku, gdy bufor będzie pusty, metoda ta zwróci wyjątek, które następnie może być obsłużony, a program będzie mógł spróbować odczytać dane w późniejszym czasie.
Kolejnym sposobem jest skorzystanie z metody select(). Przykład: ready_sockets = select.select([sock], [sock], [sock], 0.1) if (len(ready_sockets[2]) > 0):
#wystąpił błąd, tutaj obsługa błędów elif (len(ready_sockets[l]) > 0):
#gniazdo gotowe do wysłania danych elif (len(ready_sockets[0]) > 0):
#gniazdo gotowe do odczytu data, addr = sock.recvfrom(1024)
Metoda select() przyjmuje 4 argumenty. Pierwszym argumentem jest tablica zawierająca gniazda, które będą sprawdzane pod kątem gotowości do odczytu, drugim argumentem jest tablica, zawierająca gniazda, które będą sprawdzane pod kątem gotowości do zapisu, trzecim argumentem jest tablica, zawierająca gniazda, które będą sprawdzane pod kątem błędów, natomiast ostatnim argumentem jest maksymalny czas oczekiwania (timeo-ut).
11