Skip to content
This repository was archived by the owner on Nov 25, 2025. It is now read-only.

Commit 8494ab8

Browse files
committed
Differentiate recv and recvfrom in sockets
1 parent c36bfdc commit 8494ab8

3 files changed

Lines changed: 32 additions & 23 deletions

File tree

pyremoteplay/ddp.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -519,7 +519,7 @@ async def _async_recv_search_msg(
519519
data = addr = response = None
520520
if stop_event.is_set():
521521
return devices
522-
response = await sock.recv(0.01)
522+
response = await sock.recvfrom(0.01)
523523
if response is not None:
524524
data, addr = response
525525
if data is not None and addr is not None:

pyremoteplay/register.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ async def _async_regist_init(host: str, host_type: str, timeout: float) -> bool:
178178
local_addr=(UDP_IP, 0), remote_addr=(host, RP_PORT)
179179
)
180180
sock.sendto(data["init"], (host, RP_PORT))
181-
response, _ = await sock.recv(timeout=timeout)
181+
response = await sock.recv(timeout=timeout)
182182
success = _check_init(data, response)
183183
sock.close()
184184
return success
@@ -212,7 +212,7 @@ async def _async_get_register_info(
212212
sock = await AsyncTCPSocket.create(remote_addr=(host, RP_PORT))
213213
sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
214214
sock.send(b"".join([headers, payload]))
215-
response, _ = await sock.recv(timeout)
215+
response = await sock.recv(timeout)
216216
if not response:
217217
_LOGGER.error("No Register Response Received")
218218
sock.close()

pyremoteplay/socket.py

Lines changed: 29 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,10 @@ def error_received(self, exc: Exception):
3535
"""Error Received."""
3636
_LOGGER.error("Socket at: %s received error: %s", self.sock.getsockname(), exc)
3737

38-
async def recv(
38+
async def recvfrom(
3939
self, timeout: float = None
4040
) -> Optional[tuple[bytes, tuple[str, int]]]:
41-
"""Return received data."""
41+
"""Return received data and addr."""
4242
if self.has_callback:
4343
return None
4444
try:
@@ -47,17 +47,26 @@ async def recv(
4747
pass
4848
return None
4949

50+
async def recv(self, timeout: float = None) -> Optional[bytes]:
51+
"""Return received data."""
52+
if self.has_callback:
53+
return None
54+
response = await self.recvfrom(timeout=timeout)
55+
if response:
56+
return response[0]
57+
return None
58+
5059
def sendto(self, data: bytes, *_):
5160
"""Send packet."""
5261
raise NotImplementedError
5362

5463
def set_callback(
5564
self, callback: Union[Callable[[bytes, tuple[str, int]], None], None]
5665
):
57-
"""Set callback for datagram received.
66+
"""Set callback for data received.
5867
5968
Setting this will flush packet received packet queue.
60-
:meth:`recv() <pyremoteplay.socket.AsyncUDPProtocol.recv>`
69+
:meth:`recv() <pyremoteplay.socket.AsyncBaseSocket.recv>`
6170
will always return None.
6271
6372
:param callback: callback for data received
@@ -121,7 +130,7 @@ def data_received(self, data: bytes):
121130
self._packets.put_nowait(item)
122131

123132
def sendto(self, data: bytes, *_):
124-
"""Send packet."""
133+
"""Send packet to address."""
125134
self._transport.write(data)
126135

127136

@@ -140,21 +149,9 @@ def datagram_received(self, data: bytes, addr: tuple[str, int]):
140149
else:
141150
self._packets.put_nowait(item)
142151

143-
async def recv(
144-
self, timeout: float = None
145-
) -> Optional[tuple[bytes, tuple[str, int]]]:
146-
"""Return received data."""
147-
if self.has_callback:
148-
return None
149-
try:
150-
return await asyncio.wait_for(self._packets.get(), timeout=timeout)
151-
except (asyncio.TimeoutError, asyncio.CancelledError):
152-
pass
153-
return None
154-
155152
# pylint: disable=arguments-differ
156153
def sendto(self, data: bytes, addr: tuple[str, int] = None):
157-
"""Send packet."""
154+
"""Send packet to address."""
158155
self._transport.sendto(data, addr)
159156

160157

@@ -194,7 +191,7 @@ def sendto(self, data: bytes, addr: tuple[str, int] = None):
194191
"""Send Packet"""
195192
self._protocol.sendto(data, addr)
196193

197-
async def recv(self, timeout: float = None):
194+
async def recv(self, timeout: float = None) -> Optional[bytes]:
198195
"""Receive a packet."""
199196

200197
packet = await self._protocol.recv(timeout)
@@ -204,6 +201,18 @@ async def recv(self, timeout: float = None):
204201

205202
return packet
206203

204+
async def recvfrom(
205+
self, timeout: float = None
206+
) -> Optional[tuple[bytes, tuple[str, int]]]:
207+
"""Receive a packet and address."""
208+
209+
response = await self._protocol.recvfrom(timeout)
210+
211+
if response is None and self._protocol.closed:
212+
raise OSError("Socket is closed")
213+
214+
return response
215+
207216
def get_extra_info(self, name: str, default: Any = None) -> Any:
208217
"""Return Extra Info."""
209218
return self._protocol.get_extra_info(name, default)
@@ -215,7 +224,7 @@ def setsockopt(self, __level: int, __optname: int, __value: int | bytes, /):
215224
def set_callback(
216225
self, callback: Union[Callable[[bytes, tuple[str, int]], None], None]
217226
):
218-
"""Set callback for datagram received.
227+
"""Set callback for data received.
219228
220229
Setting this will flush packet received packet queue.
221230
:meth:`recv() <pyremoteplay.socket.AsyncBaseSocket.recv>`

0 commit comments

Comments
 (0)