Save current changes before reorganizing drivers and cleaning workspace
This commit is contained in:
+59
-3
@@ -136,6 +136,46 @@ class VideoStreamServer:
|
||||
except Exception as e:
|
||||
print(f"Failed to start UDP stream server: {e}")
|
||||
|
||||
def restart_tcp_server(self):
|
||||
"""Re-initializes the TCP stream server socket after a fatal error."""
|
||||
print("Restarting TCP Stream Server...")
|
||||
self.close_tcp_client()
|
||||
try:
|
||||
if self.tcp_server:
|
||||
self.tcp_server.close()
|
||||
except:
|
||||
pass
|
||||
self.tcp_server = None
|
||||
time.sleep_ms(100)
|
||||
try:
|
||||
self.tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||
self.tcp_server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
||||
self.tcp_server.bind(('', self.tcp_port))
|
||||
self.tcp_server.listen(1)
|
||||
self.tcp_server.setblocking(False)
|
||||
print(f"TCP Stream Server restarted on port {self.tcp_port}")
|
||||
except Exception as e:
|
||||
print(f"Failed to restart TCP stream server: {e}")
|
||||
|
||||
def restart_udp_sock(self):
|
||||
"""Re-initializes the UDP stream server socket after a fatal error."""
|
||||
print("Restarting UDP Stream Server...")
|
||||
try:
|
||||
if self.udp_sock:
|
||||
self.udp_sock.close()
|
||||
except:
|
||||
pass
|
||||
self.udp_sock = None
|
||||
time.sleep_ms(100)
|
||||
try:
|
||||
self.udp_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
||||
self.udp_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
||||
self.udp_sock.bind(('', self.udp_port))
|
||||
self.udp_sock.setblocking(False)
|
||||
print(f"UDP Stream Server restarted on port {self.udp_port}")
|
||||
except Exception as e:
|
||||
print(f"Failed to restart UDP stream server: {e}")
|
||||
|
||||
def update(self):
|
||||
"""Updates connection states and checks for incoming video data.
|
||||
Call this periodically in the main execution loop.
|
||||
@@ -195,7 +235,16 @@ class VideoStreamServer:
|
||||
self._draw_frame()
|
||||
self.chunks_received = 0 # Reset for next frame
|
||||
except OSError as e:
|
||||
break # EWOULDBLOCK (no data available)
|
||||
import errno
|
||||
err = getattr(e, 'errno', None)
|
||||
if err is None and e.args:
|
||||
err = e.args[0]
|
||||
ewouldblock = getattr(errno, 'EWOULDBLOCK', errno.EAGAIN)
|
||||
if err in (errno.EAGAIN, ewouldblock) or err is None:
|
||||
break # EAGAIN/EWOULDBLOCK (no data available)
|
||||
print(f"Fatal UDP socket error in update(): {e}. Re-initializing UDP socket...")
|
||||
self.restart_udp_sock()
|
||||
break
|
||||
|
||||
# 3. Handle TCP stream
|
||||
if self.tcp_server:
|
||||
@@ -208,8 +257,15 @@ class VideoStreamServer:
|
||||
self.active = True
|
||||
self.last_packet_time = now
|
||||
print(f"TCP Stream client connected from: {addr}")
|
||||
except OSError:
|
||||
pass
|
||||
except OSError as e:
|
||||
import errno
|
||||
err = getattr(e, 'errno', None)
|
||||
if err is None and e.args:
|
||||
err = e.args[0]
|
||||
ewouldblock = getattr(errno, 'EWOULDBLOCK', errno.EAGAIN)
|
||||
if err not in (errno.EAGAIN, ewouldblock) and err is not None:
|
||||
print(f"Fatal TCP stream server socket error in accept(): {e}. Re-initializing...")
|
||||
self.restart_tcp_server()
|
||||
|
||||
# If client is connected, read data
|
||||
if self.tcp_client is not None:
|
||||
|
||||
Reference in New Issue
Block a user