{"record":{"id":"174caf33bc235b43","repo":"python/cpython","slug":"a-datagram-socket-was-expected-got-sock-r","errorCode":null,"errorMessage":"A datagram socket was expected, got {sock!r}","messagePattern":"A datagram socket was expected, got (.+?)","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"Lib/asyncio/base_events.py","lineNumber":1396,"sourceCode":"        try:\n            await waiter\n        except BaseException:\n            transport.close()\n            conmade_cb.cancel()\n            resume_cb.cancel()\n            raise\n\n        return ssl_protocol._app_transport\n\n    async def create_datagram_endpoint(self, protocol_factory,\n                                       local_addr=None, remote_addr=None, *,\n                                       family=0, proto=0, flags=0,\n                                       reuse_port=None,\n                                       allow_broadcast=None, sock=None):\n        \"\"\"Create datagram connection.\"\"\"\n        if sock is not None:\n            if sock.type == socket.SOCK_STREAM:\n                raise ValueError(\n                    f'A datagram socket was expected, got {sock!r}')\n            if (local_addr or remote_addr or\n                    family or proto or flags or\n                    reuse_port or allow_broadcast):\n                # show the problematic kwargs in exception msg\n                opts = dict(local_addr=local_addr, remote_addr=remote_addr,\n                            family=family, proto=proto, flags=flags,\n                            reuse_port=reuse_port,\n                            allow_broadcast=allow_broadcast)\n                problems = ', '.join(f'{k}={v}' for k, v in opts.items() if v)\n                raise ValueError(\n                    f'socket modifier keyword arguments can not be used '\n                    f'when sock is specified. ({problems})')\n            sock.setblocking(False)\n            r_addr = None\n        else:\n            if not (local_addr or remote_addr):\n                if family == 0:","sourceCodeStart":1378,"sourceCodeEnd":1414,"githubUrl":"https://github.com/python/cpython/blob/bc6749cc3b5ae4a5e88a6cc2d5b3bebbe354eae6/Lib/asyncio/base_events.py#L1378-L1414","documentation":"Raised by create_datagram_endpoint() when a pre-created socket is passed via sock= but its type is SOCK_STREAM. UDP endpoints require a datagram (SOCK_DGRAM) socket; a TCP socket cannot carry datagram semantics.","triggerScenarios":"Calling loop.create_datagram_endpoint(protocol_factory, sock=tcp_sock) where tcp_sock was created with socket.socket(socket.AF_INET, socket.SOCK_STREAM) or obtained from a TCP accept/connect.","commonSituations":"Copy-pasting socket-creation code from a TCP example into a UDP endpoint; passing a socket from a connection pool or a library that only creates stream sockets; confusing SOCK_STREAM vs SOCK_DGRAM constants.","solutions":["Create the socket as a datagram socket: socket.socket(family, socket.SOCK_DGRAM) before passing it","If you actually need a stream connection, use loop.create_connection() (or connect_accepted_socket) instead of create_datagram_endpoint()","Double-check the socket type at runtime with sock.getsockopt(socket.SOL_SOCKET, socket.SO_TYPE) before passing it"],"exampleFix":"# before\nsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)\nawait loop.create_datagram_endpoint(factory, sock=sock)\n\n# after\nsock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)\nawait loop.create_datagram_endpoint(factory, sock=sock)","handlingStrategy":"validation","validationCode":"import socket\nif sock.getsockopt(socket.SOL_SOCKET, socket.SO_TYPE) != socket.SOCK_DGRAM:\n    raise ValueError(f'need SOCK_DGRAM, got {sock!r}')\ntransport, protocol = await loop.create_datagram_endpoint(factory, sock=sock)","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Centralize socket creation so UDP paths always use SOCK_DGRAM","Assert sock.type == socket.SOCK_DGRAM in tests for datagram endpoint helpers"],"tags":["asyncio","udp","datagram","socket"],"backgroundTag":null,"analyzedSha":"bc6749cc3b5ae4a5e88a6cc2d5b3bebbe354eae6","analyzedAt":"2026-08-14T22:01:13.976Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}