Title: Can't receive replies to multicast UDP packets · Issue #480 · python/asyncio · GitHub
Open Graph Title: Can't receive replies to multicast UDP packets · Issue #480 · python/asyncio
X Title: Can't receive replies to multicast UDP packets · Issue #480 · python/asyncio
Description: It doesn't appear to be possible to receive replies to multicast UDP messages. Server-side multicast does work, but only with a bit of extra config. Given the following (working) server code, adapted from the UDP Echo example: import asy...
Open Graph Description: It doesn't appear to be possible to receive replies to multicast UDP messages. Server-side multicast does work, but only with a bit of extra config. Given the following (working) server code, adapt...
X Description: It doesn't appear to be possible to receive replies to multicast UDP messages. Server-side multicast does work, but only with a bit of extra config. Given the following (working) server code, a...
Opengraph URL: https://github.com/python/asyncio/issues/480
X: @github
Domain: patch-diff.githubusercontent.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"Can't receive replies to multicast UDP packets","articleBody":"It doesn't appear to be possible to receive replies to multicast UDP messages. Server-side multicast does work, but only with a bit of extra config.\r\n\r\nGiven the following (working) server code, adapted from the UDP Echo example:\r\n\r\n```\r\nimport asyncio\r\nimport logging\r\nimport socket\r\nimport struct\r\n\r\nBROADCAST_PORT = 1910\r\nBROADCAST_ADDR = \"239.255.255.250\"\r\n\r\n\r\nclass MulticastServerProtocol:\r\n\r\n def connection_made(self, transport):\r\n self.transport = transport\r\n\r\n\r\n def datagram_received(self, data, addr):\r\n print('Received {!r} from {!r}'.format(data, addr))\r\n data = \"I received {!r}\".format(data).encode(\"ascii\")\r\n print('Send {!r} to {!r}'.format(data, addr))\r\n self.transport.sendto(data, addr)\r\n\r\n\r\n\r\nloop = asyncio.get_event_loop()\r\nloop.set_debug(True)\r\nlogging.basicConfig(level=logging.DEBUG)\r\n\r\n\r\nsock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)\r\nsock.bind(('', BROADCAST_PORT))\r\ngroup = socket.inet_aton(BROADCAST_ADDR)\r\nmreq = struct.pack('4sL', group, socket.INADDR_ANY)\r\nsock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)\r\nsock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)\r\nsock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)\r\n\r\nlisten = loop.create_datagram_endpoint(\r\n MulticastServerProtocol,\r\n sock=sock,\r\n)\r\ntransport, protocol = loop.run_until_complete(listen)\r\n\r\nloop.run_forever()\r\nloop.close()\r\n```\r\n\r\n...the following _non-asyncio_ client code sends a broadcast packet and correctly receives the responses:\r\n\r\n```\r\nimport socket\r\nimport struct\r\nimport sys\r\n\r\nBROADCAST_PORT = 1910\r\nBROADCAST_ADDR = \"239.255.255.250\"\r\n\r\n\r\nsock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)\r\nsock.settimeout(3)\r\nttl = struct.pack('b', 1)\r\nsock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, ttl)\r\n\r\ntry:\r\n sent = sock.sendto(\r\n sys.argv[1].encode(\"ascii\"),\r\n (BROADCAST_ADDR, BROADCAST_PORT)\r\n )\r\n\r\n while True:\r\n try:\r\n data, server = sock.recvfrom(1024)\r\n except socket.timeout:\r\n break\r\n else:\r\n print(\"Reply from {}: {!r}\".format(server, data))\r\n\r\nfinally:\r\n sock.close()\r\n```\r\n\r\nHowever, the following code, which I'm pretty sure is the asyncio equivalent, sends out the mutlicast packet correctly but never receives a response:\r\n\r\n```\r\nimport asyncio\r\nimport socket\r\nimport struct\r\nimport sys\r\n\r\nBROADCAST_PORT = 1910\r\nBROADCAST_ADDR = \"239.255.255.250\"\r\n\r\n\r\n\r\nclass DiscoveryClientProtocol:\r\n def __init__(self, loop):\r\n self.loop = loop\r\n self.transport = None\r\n\r\n def connection_made(self, transport):\r\n self.transport = transport\r\n sock = self.transport.get_extra_info('socket')\r\n sock.settimeout(3)\r\n ttl = struct.pack('b', 1)\r\n sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, ttl)\r\n\r\n self.transport.sendto(sys.argv[1].encode(\"ascii\"))\r\n\r\n def datagram_received(self, data, addr):\r\n print(\"Reply from {}: {!r}\".format(addr, data))\r\n # Don't close the socket as we might get multiple responses.\r\n\r\n def error_received(self, exc):\r\n print('Error received:', exc)\r\n\r\n def connection_lost(self, exc):\r\n print(\"Socket closed, stop the event loop\")\r\n self.loop.stop()\r\n\r\n\r\nloop = asyncio.get_event_loop()\r\nconnect = loop.create_datagram_endpoint(\r\n lambda: DiscoveryClientProtocol(loop),\r\n remote_addr=(BROADCAST_ADDR, BROADCAST_PORT),\r\n)\r\ntransport, protocol = loop.run_until_complete(connect)\r\nloop.run_forever()\r\ntransport.close()\r\nloop.close()\r\n\r\n```","author":{"url":"https://github.com/gpjt","@type":"Person","name":"gpjt"},"datePublished":"2017-01-04T16:07:09.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":6},"url":"https://github.com/480/asyncio/issues/480"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:04959fa4-354e-ad98-c788-19a731976e82 |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | BCC0:35FE44:E4624:13C5B2:696E257C |
| html-safe-nonce | a59f568fb74bff9d1bfa7855c4ca919880f14ed31e788721cc672aade8568bb8 |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJCQ0MwOjM1RkU0NDpFNDYyNDoxM0M1QjI6Njk2RTI1N0MiLCJ2aXNpdG9yX2lkIjoiNjQzNDk2NzUxMDcxNjM5MjgyOCIsInJlZ2lvbl9lZGdlIjoiaWFkIiwicmVnaW9uX3JlbmRlciI6ImlhZCJ9 |
| visitor-hmac | 0d11073e6e0c7680f164397469109d8a59b58182faf71bbc3442517bbd4d3166 |
| hovercard-subject-tag | issue:198743983 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/python/asyncio/480/issue_layout |
| twitter:image | https://opengraph.githubassets.com/a44acf48f4cb22e60b50a43bfbe7734867b50a07fefc780cc81aa0a76c27c309/python/asyncio/issues/480 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/a44acf48f4cb22e60b50a43bfbe7734867b50a07fefc780cc81aa0a76c27c309/python/asyncio/issues/480 |
| og:image:alt | It doesn't appear to be possible to receive replies to multicast UDP messages. Server-side multicast does work, but only with a bit of extra config. Given the following (working) server code, adapt... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | gpjt |
| hostname | github.com |
| expected-hostname | github.com |
| None | 2fbe8cba5e260284c10af515699ff9bb2d6ace05ab6c2e2e585b71d93b2812c3 |
| turbo-cache-control | no-preview |
| go-import | github.com/python/asyncio git https://github.com/python/asyncio.git |
| octolytics-dimension-user_id | 1525981 |
| octolytics-dimension-user_login | python |
| octolytics-dimension-repository_id | 33739295 |
| octolytics-dimension-repository_nwo | python/asyncio |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 33739295 |
| octolytics-dimension-repository_network_root_nwo | python/asyncio |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | 7fb3bc5c995a876085291706b75cf9b08900c338 |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width