Ϫf7dZddlZddlZddlZddlZddlmZddlmZddl m Z m Z m Z m Z ddlmZmZddlmZmZddlmZmZmZdd lmZdd lmZmZeee j<e j>e j@Gd d ejBZ"Gd dZ#ee jHGdde#e"Z%y)z UDP support for IOCP reactor N)Optional) implementer)addressdefererror interfaces) isIPAddress isIPv6Address)abstract iocpsupport)ERROR_CONNECTION_REFUSEDERROR_IO_PENDINGERROR_PORT_UNREACHABLE)IReadWriteHandle)failurelogceZdZUdZej ZejZdZ dZ e e e d<ddZdZdefdZd Zd Zd Zd Zd ZdZdZdZddZdZdZdZdZdZddZ dZ!dZ"dZ#dZ$dZ%y)Portz UDP port, listening for packets. @ivar addressFamily: L{socket.AF_INET} or L{socket.AF_INET6}, depending on whether this port is listening on an IPv4 address or an IPv6 address. FN_realPortNumberc||_||_||_||_|j d|_|j tjj||tj|j|j}tj|j}t!||_t!t%j&d|_y)z> Initialize with a numeric port to listen on. Ni)portprotocolreadBufferSize interface setLogStr_connectedAddr_setAddressFamilyr FileHandle__init__socket addressFamily socketType_iocp maxAddrLenfileno bytearray addressBufferstructcalcsizeaddressLengthBuffer)selfrprotor maxPacketSizereactorsktaddrLens B/usr/lib/python3/dist-packages/twisted/internet/iocpreactor/udp.pyr z Port.__init__2s  +" "  $$T73mmD..@""3::<0&w/#,V__S-A#B ct|jrtj|_yt |jrtj |_y|jr tj|jdy)z8 Resolve address family for the socket. znot an IPv4 or IPv6 addressN) r rr!AF_INET6r"r AF_INETrInvalidAddressErrorr,s r2rzPort._setAddressFamilyFs]  (!'D   (!'D  ^^++ = r3returnc|j'd|jjd|jdSd|jjdS)Nz not connected>)rr __class__r8s r2__repr__z Port.__repr__SsO    +t}}../tD4H4H3IK Kt}}../? ?r3c|jS)z) Return a socket object. )r!r8s r2 getHandlezPort.getHandleY{{r3cD|j|jy)z Create and bind my socket, and begin listening on it. This is called on unserialization, and must be called after creating a server to begin listening on the specified port. N) _bindSocket_connectToProtocolr8s r2startListeningzPort.startListening_s  !r3cb|jj|j|jSN)r/ createSocketr"r#r8s r2rHzPort.createSocketis#||((););T__MMr3c |j}|j|j|jf|jd|_tj|j|jd|jd|_ ||_|jj|_y#t$r0}t j |j|j|d}~wwxYw)Nz starting on T)rHbindrrOSErrorrCannotListenError getsocknamerrmsg _getLogPrefixr connectedr!r& getFileHandle)r,r0les r2rCzPort._bindSocketls I##%C HHdnndii0 1 #03 !!$--0$2F2F H  ![[// I))$..$))RH H Is7B88 C1+C,,C1c|jj||j|jj |yrG)rmakeConnection startReadingr/addActiveHandler8s r2rDzPort._connectToProtocols2 $$T*  $$T*r3cd|jr$|j||||jyyrG)reading handleReaddoReadr,rcdataevts r2cbReadz Port.cbReads' << OOBc * KKM r3c |tjtjttfvr(|j r|j jyy|r;tjdtjj|dd|dy |j jt|jd|tj |j"y#t$$rtj&YywxYw)Nzerror in recvfrom -- z unknown errorz ())errnoWSAECONNREFUSED WSAECONNRESETr rrrconnectionRefusedrrO errorcodegetdatagramReceivedbytesbuffr$ makesockaddr addr_buff BaseExceptionerrr\s r2rZzPort.handleReads  ! !    $ "   "" //1#  GG??&&r?;RA    ..#((5D/*E,>,>s}},M!   sAC##DDc|tj|j|}|jdx|_}|j x|_}|jx|_}tj|j||||\}}|r4|tk7r*|jjd|j|||yyyNr)r$Eventr` _readBuffersrkr(rmr+ addr_len_buffrecvfromrRrr/ callLater)r,r_rkrmrtr]r^s r2r[z Port.doReadskk$++t,++A..4$($6$66 ,0,D,DDM>>    $ =# D "(( LL " "1dkk2tS A )2r3c |jr.|d|jfvsJ |jj|S|dk7sJt#|ds/t%|ds!|ddk7rtj&|ddt#|dr6|j(tj*k(rtj&|ddt%|dr6|j(tj,k(rtj&|dd |jj/||S#t$r}|jd}|t j k(r|j|cYd}~S|t jk(rtjd|t jt jttfvr|jj!nYd}~yd}~wwxYw#t$r}|jd}|t j k(r|j||cYd}~S|t jk(rtjd|t jt jttfvrYd}~yd}~wwxYw)z~ Write a datagram. @param addr: should be a tuple (ip, port), can be None in connected mode. Nrzmessage too longz z0write() only accepts IP addresses, not hostnamesz*IPv6 port write() called with IPv4 addressz*IPv4 port write() called with IPv6 address)rr!sendrLargsrcWSAEINTRwrite WSAEMSGSIZErMessageLengthErrorrdrer rrrfr r r7r"r5r6sendto)r,datagramaddrsenos r2r{z Port.writesF   D$"5"566 66 {{''11"4< <Q(%d1g.G},//GO47#(:(:foo(M//GIT!W%$*<*<*N//GI {{))(D99E WWQZ'::h//5,,,223EFF))'',*  MM3356 F WWQZ'::h555,,,223EFF))'',* # sOD$G"$ G-2GG%A0GG" J+3I>J$AI>=I>>JcF|jdj||y)Nr3)r{join)r,seqrs r2 writeSequencezPort.writeSequences 388C=$'r3c|jr tdt|s!t|st j |d||f|_|j j||fy)z- 'Connect' to remote server. z\already connected, reconnecting is not currently supported (talk to itamar if you want this)znot an IPv4 or IPv6 address.N)r RuntimeErrorr r rr7r!connect)r,hostrs r2rz Port.connectsf   4 4 t)<++D2PQ Q#Tl T4L)r3c|j|jj||jr'|jj d|j yyrq) stopReadingr/removeActiveHandlerQrvconnectionLostr8s r2_loseConnectionzPort._loseConnectionsF  ''- >> LL " "1d&9&9 : r3cz|jrtjx}|_nd}|j |SrG)rQrDeferreddr)r,results r2 stopListeningzPort.stopListening s2 >>#nn. .FTVF  r3c\tjdtd|jy)Nz-Please use stopListening() to disconnect port) stacklevel)warningswarnDeprecationWarningrr8s r2loseConnectionzPort.loseConnections% ;  r3cZtjd|jzd|_tjj |||j j|jj|`|` t|dr|jjd|` yy)z& Cleans up my socket. z(UDP Port %s Closed)Nr)rrOrr rrrdoStopr!closerRhasattrrcallback)r,reasons r2rzPort.connectionLosts &)=)==>#**48   K   4  FFOOD ! r3cN|j|j}d|z|_y)zP Initialize the C{logstr} attribute to be used by C{logPrefix}. z%s (UDP)N)rPrlogstr)r, logPrefixs r2rzPort.setLogStr)s$&&t}}5  9, r3c|jS)zK Returns the name of my class, to prefix log entries with. )rr8s r2rzPort.logPrefix0rAr3c |jj}|jtjk(rt j dg|S|jtj k(rt jdg|ddSy)z Return the local address of the UDP connection @returns: the local address of the UDP connection @rtype: L{IPv4Address} or L{IPv6Address} UDPNr)r!rNr"r6r IPv4Addressr5 IPv6Addressr,rs r2getHostz Port.getHost6sq{{&&(    /&&u4t4 4   6?? 2&&u:Ra: :3r3cv|jjtjtj|y)z Set whether this port may broadcast. This is disabled by default. @param enabled: Whether the port may broadcast. @type enabled: L{bool} N)r! setsockopt SOL_SOCKET SO_BROADCAST)r,enableds r2setBroadcastAllowedzPort.setBroadcastAllowedCs& v00&2E2EwOr3ct|jjtjtjS)z Checks if broadcast is currently allowed on this port. @return: Whether this port may broadcast. @rtype: L{bool} )boolr! getsockoptrrr8s r2getBroadcastAllowedzPort.getBroadcastAllowedLs,DKK**6+<+Q>QRSSr3) NrG)&__name__ __module__ __qualname____doc__r!r6r" SOCK_DGRAMr#dynamicReadBuffersrrint__annotations__r rstrr>r@rErHrCrDr`rZr[r{rrrrrrrrrrrr3r2rrsNNM""J&*OXc])C( @#@  "N0(+  ,B$?B( *;  - ;PTr3rcVeZdZdZdZdZdZdZdZdZ dZ dd Z d Z d Z dd Zy )MulticastMixinz, Implement multicast functionality. c|jjtjtj}tjt j d|S)Nz@i)r!r IPPROTO_IPIP_MULTICAST_IF inet_ntoar)pack)r,rs r2getOutgoingInterfacez#MulticastMixin.getOutgoingInterface[s@ KK " "6#4#4f6L6L M D! 455r3cj|jj|j|jS)z. Returns Deferred of success. )r/resolve addCallback _setInterfacers r2setOutgoingInterfacez#MulticastMixin.setOutgoingInterface_s*||##D)55d6H6HIIr3ctj|}|jjtjtj|y)NrJ)r! inet_atonrrr)r,rrs r2rzMulticastMixin._setInterfacees7   T " v00&2H2H!Lr3cr|jjtjtjSrG)r!rrIP_MULTICAST_LOOPr8s r2getLoopbackModezMulticastMixin.getLoopbackModejs%{{%%f&7&79Q9QRRr3ctjdt|}|jj tj tj |y)Nb)r)rrr!rrr)r,modes r2setLoopbackModezMulticastMixin.setLoopbackModems8{{3T + v00&2J2JDQr3cr|jjtjtjSrG)r!rrIP_MULTICAST_TTLr8s r2getTTLzMulticastMixin.getTTLqs%{{%%f&7&79P9PQQr3ctjd|}|jjtjtj |y)NB)r)rr!rrr)r,ttls r2setTTLzMulticastMixin.setTTLts4kk#s# v00&2I2I3Or3cn|jj|j|j|dS)zF Join a multicast group. Returns Deferred of success. rJr/rr _joinAddr1r,rrs r2 joinGroupzMulticastMixin.joinGroupx-||##D)55dooyRSTTr3cn|jj|j|j||SrG)r/rr _joinAddr2)r,rrrs r2rzMulticastMixin._joinAddr1~s+||##I.::4??DRVWWr3ctj|}tj|}|rtj}ntj} |jj tj |||zy#t $r>}tjtj||g|jcYd}~Sd}~wwxYwrG) r!rIP_ADD_MEMBERSHIPIP_DROP_MEMBERSHIPrrrLrFailurerMulticastJoinErrorry)r,rrrcmdes r2rzMulticastMixin._joinAddr2s%$$Y/ **C++C W KK " "6#4#4c4);K L W??5#;#;D)#Uaff#UV V Ws.A>> C3C:CCcn|jj|j|j|dS)zD Leave multicast group, return Deferred of success. rrrs r2 leaveGroupzMulticastMixin.leaveGrouprr3N)r)rrrrrrrrrrrrrrrrr3r2rrVsG6J  SRRPU X WUr3rc&eZdZdZ ddZdZy) MulticastPortz. UDP Port that supports multicasting. NcFtj||||||||_yrG)rr listenMultiple)r,rr-rr.r/rs r2r zMulticastPort.__init__s" dD%M7K,r3c$tj|}|jrn|jtj tj dttdr/|jtj tjd|S)NrJ SO_REUSEPORT) rrHrrr!r SO_REUSEADDRrr)r,r0s r2rHzMulticastPort.createSocketsb%    NN6,,f.A.A1 Ev~.v00&2E2EqI r3)rrNF)rrrrr rHrr3r2rrs -r3r)&rrcr!r)rtypingrzope.interfacertwisted.internetrrrrtwisted.internet.abstractr r twisted.internet.iocpreactorr r r$"twisted.internet.iocpreactor.constr rr'twisted.internet.iocpreactor.interfacesrtwisted.pythonrrIListeningPort IUDPTransport ISystemHandlerrrIMulticastTransportrrr3r2rs &>>@G E'   qT8  qT  qTh ;U;U| Z + +,ND-r3