Skip to content

Commit f202273

Browse files
committed
Bug fix to prevent the server from hanging when client disconnects
- Server would hang and not serve any other clients when a client disconnected, fixed in `socket_write`. - Fixed `_get_tx_free_size` bug that would always return 0 and `socket_write` that used this function in a useless way and didn't actually check anything because it checked whether the returned bytearray was in a tuple of status ints. - `_get_tx_free_size` and `_get_rx_rcv_size` now return int instead of bytearray as you'd expect.
1 parent 5d9f5a9 commit f202273

File tree

1 file changed

+10
-12
lines changed

1 file changed

+10
-12
lines changed

adafruit_wiznet5k/adafruit_wiznet5k.py

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -494,7 +494,6 @@ def socket_available(self, socket_num, sock_type=SNMR_TCP):
494494

495495
res = self._get_rx_rcv_size(socket_num)
496496

497-
res = int.from_bytes(res, "b")
498497
if sock_type == SNMR_TCP:
499498
return res
500499
if res > 0:
@@ -574,11 +573,9 @@ def get_socket(self):
574573

575574
sock = 0
576575
for _sock in range(self.max_sockets):
577-
status = self.socket_status(_sock)
578-
if (
579-
status[0] == SNSR_SOCK_CLOSED
580-
or status[0] == SNSR_SOCK_FIN_WAIT
581-
or status[0] == SNSR_SOCK_CLOSE_WAIT
576+
status = self.socket_status(_sock)[0]
577+
if (status in
578+
(SNSR_SOCK_CLOSED, SNSR_SOCK_FIN_WAIT, SNSR_SOCK_CLOSE_WAIT)
582579
):
583580
sock = _sock
584581
break
@@ -670,7 +667,6 @@ def socket_read(self, socket_num, length):
670667

671668
# Check if there is data available on the socket
672669
ret = self._get_rx_rcv_size(socket_num)
673-
ret = int.from_bytes(ret, "b")
674670
if self._debug:
675671
print("Bytes avail. on sock: ", ret)
676672
if ret == 0:
@@ -737,7 +733,7 @@ def socket_write(self, socket_num, buffer):
737733
free_size = self._get_tx_free_size(socket_num)
738734
while free_size < ret:
739735
free_size = self._get_tx_free_size(socket_num)
740-
status = self.socket_status(socket_num)
736+
status = self.socket_status(socket_num)[0]
741737
if status not in (SNSR_SOCK_ESTABLISHED, SNSR_SOCK_CLOSE_WAIT):
742738
ret = 0
743739
break
@@ -761,7 +757,9 @@ def socket_write(self, socket_num, buffer):
761757
while (
762758
self._read_socket(socket_num, REG_SNIR)[0] & SNIR_SEND_OK
763759
) != SNIR_SEND_OK:
764-
if self.socket_status(socket_num) == SNSR_SOCK_CLOSED:
760+
if (self.socket_status(socket_num)[0] in
761+
(SNSR_SOCK_CLOSED, SNSR_SOCK_FIN_WAIT, SNSR_SOCK_CLOSE_WAIT)
762+
):
765763
# self.socket_close(socket_num)
766764
return 0
767765
time.sleep(0.01)
@@ -779,17 +777,17 @@ def _get_rx_rcv_size(self, sock):
779777
val_1 = self._read_snrx_rsr(sock)
780778
if val_1 != 0:
781779
val = self._read_snrx_rsr(sock)
782-
return val
780+
return int.from_bytes(val, "b")
783781

784782
def _get_tx_free_size(self, sock):
785783
"""Get free size of sock's tx buffer block."""
786784
val = 0
787-
val_1 = 0
785+
val_1 = self._read_sntx_fsr(sock)
788786
while val != val_1:
789787
val_1 = self._read_sntx_fsr(sock)
790788
if val_1 != 0:
791789
val = self._read_sntx_fsr(sock)
792-
return val
790+
return int.from_bytes(val, "b")
793791

794792
def _read_snrx_rd(self, sock):
795793
self._pbuff[0] = self._read_socket(sock, REG_SNRX_RD)[0]

0 commit comments

Comments
 (0)