|
@@ -61,7 +61,11 @@ class RelayLink:
|
|
|
async def send(self, frame: Frame) -> None:
|
|
async def send(self, frame: Frame) -> None:
|
|
|
if self.closed:
|
|
if self.closed:
|
|
|
raise ConnectionError(f"relay closed: {self.node.name}")
|
|
raise ConnectionError(f"relay closed: {self.node.name}")
|
|
|
- await write_frame(self.writer, frame)
|
|
|
|
|
|
|
+ try:
|
|
|
|
|
+ await write_frame(self.writer, frame)
|
|
|
|
|
+ except (BrokenPipeError, ConnectionResetError, RuntimeError, OSError, asyncio.CancelledError) as exc:
|
|
|
|
|
+ await self.close()
|
|
|
|
|
+ raise ConnectionError(f"relay closed: {self.node.name}") from exc
|
|
|
|
|
|
|
|
async def close(self) -> None:
|
|
async def close(self) -> None:
|
|
|
if self.closed:
|
|
if self.closed:
|
|
@@ -297,7 +301,6 @@ class UdpAssociateServer(asyncio.DatagramProtocol):
|
|
|
flow.duplicate_responses += 1
|
|
flow.duplicate_responses += 1
|
|
|
if flow.winner_name == source_name:
|
|
if flow.winner_name == source_name:
|
|
|
self.transport.sendto(packet, self.client_addr)
|
|
self.transport.sendto(packet, self.client_addr)
|
|
|
- self._log_udp_summary()
|
|
|
|
|
|
|
|
|
|
def set_flow_candidates(self, flow: UdpFlowState, candidate_names: tuple[str, ...]) -> None:
|
|
def set_flow_candidates(self, flow: UdpFlowState, candidate_names: tuple[str, ...]) -> None:
|
|
|
if not flow.candidate_names:
|
|
if not flow.candidate_names:
|