
    Yf7                     z   d Z ddlZddlZddlZddlZddlmZ ddlmZ ddl	m
Z
mZmZmZ ddlmZmZ ddlmZmZ ddlmZmZmZ dd	lmZ dd
lmZmZ  eeej        ej        ej                    G d dej!                              Z" G d d          Z# eej$                   G d de#e"                      Z%dS )z
UDP support for IOCP reactor
    N)Optional)implementer)addressdefererror
interfaces)isIPAddressisIPv6Address)abstractiocpsupport)ERROR_CONNECTION_REFUSEDERROR_IO_PENDINGERROR_PORT_UNREACHABLE)IReadWriteHandle)failurelogc                       e Zd ZU dZej        Zej        ZdZ	dZ
ee         ed<   ddZd Zd	efd
Zd Zd Zd Zd Zd Zd Zd Zd Zd dZd Zd Zd Zd Zd Zd dZ d Z!d Z"d Z#d Z$d Z%dS )!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_realPortNumber     c                    || _         || _        || _        || _        |                                  d| _        |                                  t          j        	                    | |           t          j
        | j        | j                  }t          j        |                                          }t!          |          | _        t!          t%          j        d                    | _        dS )z>
        Initialize with a numeric port to listen on.
        Ni)portprotocolreadBufferSize	interface	setLogStr_connectedAddr_setAddressFamilyr   
FileHandle__init__socketaddressFamily
socketType_iocp
maxAddrLenfileno	bytearrayaddressBufferstructcalcsizeaddressLengthBuffer)selfr   protor   maxPacketSizereactorsktaddrLens           R/var/www/html/env/lib/python3.11/site-packages/twisted/internet/iocpreactor/udp.pyr"   zPort.__init__2   s     	+""   $$T7333mD.@@"3::<<00&w//#,V_S-A-A#B#B       c                     t          | j                  rt          j        | _        dS t          | j                  rt          j        | _        dS | j        rt          j        | j        d          dS )z8
        Resolve address family for the socket.
        znot an IPv4 or IPv6 addressN)	r
   r   r#   AF_INET6r$   r	   AF_INETr   InvalidAddressErrorr.   s    r4   r    zPort._setAddressFamilyF   sy     (( 	!'D(( 	!'D^ 	+ =  	 	r5   returnc                 `    | j         d| j        j         d| j          dS d| j        j         dS )N<z on >z not connected>)r   r   	__class__r:   s    r4   __repr__zPort.__repr__S   sB    +Kt}.KKD4HKKKK?t}.????r5   c                     | j         S )z)
        Return a socket object.
        )r#   r:   s    r4   	getHandlezPort.getHandleY        {r5   c                 V    |                                   |                                  dS )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_connectToProtocolr:   s    r4   startListeningzPort.startListening_   s.     	!!!!!r5   c                 L    | j                             | j        | j                  S N)r1   createSocketr$   r%   r:   s    r4   rJ   zPort.createSocketi   s    |(();T_MMMr5   c                    	 |                                  }|                    | j        | j        f           n2# t          $ r%}t          j        | j        | j        |          d }~ww xY w|                                d         | _        t          j
        |                     | j                  d| j                   d| _        || _        | j        j        | _        d S )N   z starting on T)rJ   bindr   r   OSErrorr   CannotListenErrorgetsocknamer   r   msg_getLogPrefixr   	connectedr#   r(   getFileHandle)r.   r2   les      r4   rE   zPort._bindSocketl   s    	I##%%CHHdndi01111 	I 	I 	I)$.$)RHHH	I
  #003!!$-0000$2F2FH	
 	
 	

 ![/s   58 
A' A""A'c                     | j                             |            |                                  | j                            |            d S rI   )r   makeConnectionstartReadingr1   addActiveHandler:   s    r4   rF   zPort._connectToProtocol   sF    $$T***$$T*****r5   c                 n    | j         r-|                     |||           |                                  d S d S rI   )reading
handleReaddoReadr.   rcdataevts       r4   cbReadzPort.cbRead   s=    < 	OOBc***KKMMMMM	 	r5   c                    |t           j        t           j        t          t          fv r$| j        r| j                                         d S d S |r;t          j	        dt           j
                            |d          d|d           d S 	 | j                            t          |j        d |                   t          j        |j                             d S # t$          $ r t          j                     Y d S w xY w)Nzerror in recvfrom -- zunknown errorz ())errnoWSAECONNREFUSEDWSAECONNRESETr   r   r   r   connectionRefusedr   rQ   	errorcodegetdatagramReceivedbytesbuffr&   makesockaddr	addr_buffBaseExceptionerrr^   s       r4   r\   zPort.handleRead   s!   !$"	
 
 
 " 2//111112 2 	GG?&&r?;;;;RRRA    
..#(5D5/**E,>s},M,M     !   						s   	AC C87C8c                 \   t          j        | j        |           }| j        d         x|_        }| j        x|_        }| j        x|_        }t          j	        | 
                                ||||          \  }}|r0|t          k    r'| j                            d| j        |||           d S d S d S Nr   )r&   Eventrb   _readBuffersrm   r*   ro   r-   addr_len_buffrecvfromrT   r   r1   	callLater)r.   ra   rm   ro   rv   r_   r`   s          r4   r]   zPort.doRead   s    k$+t,,+A..4$($66	,0,DDM>  $	=#
 
D  	B"((( L""1dk2tSAAAAA	B 	B((r5   c                    | j         r|d| j         fv sJ 	 | j                            |          S # t          $ r}|j        d         }|t
          j        k    r|                     |          cY d}~S |t
          j        k    rt          j
        d          |t
          j        t
          j        t          t          fv r| j                                         n Y d}~dS d}~ww xY w|dk    sJ t#          |d                   s<t%          |d                   s'|d         dk    rt          j        |d         d          t#          |d                   r0| j        t          j        k    rt          j        |d         d          t%          |d                   r0| j        t          j        k    rt          j        |d         d          	 | j                            ||          S # t          $ r}|j        d         }|t
          j        k    r|                     ||          cY d}~S |t
          j        k    rt          j
        d          |t
          j        t
          j        t          t          fv rY d}~dS  d}~ww xY w)z~
        Write a datagram.

        @param addr: should be a tuple (ip, port), can be None in connected
        mode.
        Nr   zmessage too longz<broadcast>z0write() only accepts IP addresses, not hostnamesz*IPv6 port write() called with IPv4 addressz*IPv4 port write() called with IPv6 address)r   r#   sendrN   argsre   WSAEINTRwriteWSAEMSGSIZEr   MessageLengthErrorrf   rg   r   r   r   rh   r	   r
   r9   r$   r7   r8   sendto)r.   datagramaddrsenos        r4   r}   z
Port.write   s     8	D$"566666{''111   WQZ''::h////////5,,,23EFFF)',*	   M335555 655555  4<<<<Q((%d1g.. G},,/GO   47## (:fo(M(M/GI   T!W%% $*<*N*N/GI  {))(D999   WQZ''::h555555555,,,23EFFF)',*	   FFFFF#sL   0 
C!1C+C!1A%CC!G# #
I;-2I6I;%A
I65I66I;c                 X    |                      d                    |          |           d S )Nr5   )r}   join)r.   seqr   s      r4   writeSequencezPort.writeSequence   s&    

388C==$'''''r5   c                     | j         rt          d          t          |          s$t          |          st	          j        |d          ||f| _         | j                            ||f           dS )z-
        'Connect' to remote server.
        z\already connected, reconnecting is not currently supported (talk to itamar if you want this)znot an IPv4 or IPv6 address.N)r   RuntimeErrorr	   r
   r   r9   r#   connect)r.   hostr   s      r4   r   zPort.connect   s      	4   4   	Rt)<)< 	R+D2PQQQ#TlT4L)))))r5   c                     |                                   | j                            |            | j        r"| j                            d| j                   d S d S rs   )stopReadingr1   removeActiveHandlerS   rx   connectionLostr:   s    r4   _loseConnectionzPort._loseConnection  s_    ''---> 	;L""1d&9:::::	; 	;r5   c                 v    | j         rt          j                    x}| _        nd }|                                  |S rI   )rS   r   Deferreddr   )r.   results     r4   stopListeningzPort.stopListening
  s>    > 	#n...FTVVFr5   c                 f    t          j        dt          d           |                                  d S )Nz-Please use stopListening() to disconnect port   )
stacklevel)warningswarnDeprecationWarningr   r:   s    r4   loseConnectionzPort.loseConnection  s>    ;	
 	
 	
 	

 	r5   c                 T   t          j        d| j        z             d| _        t          j                            | |           | j                                         | j        	                                 | `| `
t          | d          r| j                            d           | `dS dS )z&
        Cleans up my socket.
        z(UDP Port %s Closed)Nr   )r   rQ   r   r   r!   r   r   doStopr#   closerT   hasattrr   callback)r.   reasons     r4   r   zPort.connectionLost  s     	&)==>>>#**4888K4 	FOOD!!!	 	r5   c                 N    |                      | j                  }d|z  | _        dS )zP
        Initialize the C{logstr} attribute to be used by C{logPrefix}.
        z%s (UDP)N)rR   r   logstr)r.   	logPrefixs     r4   r   zPort.setLogStr)  s)     &&t}55	 9,r5   c                     | j         S )zK
        Returns the name of my class, to prefix log entries with.
        )r   r:   s    r4   r   zPort.logPrefix0  rC   r5   c                     | j                                         }| j        t           j        k    rt	          j        dg|R  S | j        t           j        k    rt	          j        dg|dd         R  S dS )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#   rP   r$   r8   r   IPv4Addressr7   IPv6Addressr.   r   s     r4   getHostzPort.getHost6  sy     {&&((//&u4t44446?22&u:RaR:::: 32r5   c                 f    | j                             t           j        t           j        |           dS )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     r4   setBroadcastAllowedzPort.setBroadcastAllowedC  s*     	v0&2EwOOOOOr5   c                 z    t          | j                            t          j        t          j                            S )z
        Checks if broadcast is currently allowed on this port.

        @return: Whether this port may broadcast.
        @rtype: L{bool}
        )boolr#   
getsockoptr   r   r:   s    r4   getBroadcastAllowedzPort.getBroadcastAllowedL  s*     DK**6+<f>QRRSSSr5   )r   r   NrI   )&__name__
__module____qualname____doc__r#   r8   r$   
SOCK_DGRAMr%   dynamicReadBuffersr   r   int__annotations__r"   r    strr@   rB   rG   rJ   rE   rF   rb   r\   r]   r}   r   r   r   r   r   r   r   r   r   r   r    r5   r4   r   r      s          NM"J &*OXc])))C C C C(  @# @ @ @ @  " " "N N N0 0 0(+ + +
  
  ,B B B$? ? ? ?B( ( (* * *; ; ;       - - -  ; ; ;P P PT T T T Tr5   r   c                   X    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
dd
Zd Zd ZddZdS )MulticastMixinz,
    Implement multicast functionality.
    c                     | j                             t           j        t           j                  }t          j        t          j        d|                    S )Nz@i)r#   r   
IPPROTO_IPIP_MULTICAST_IF	inet_ntoar+   pack)r.   r   s     r4   getOutgoingInterfacez#MulticastMixin.getOutgoingInterface[  s<    K""6#4f6LMMD! 4 4555r5   c                 f    | j                             |                              | j                  S )z.
        Returns Deferred of success.
        )r1   resolveaddCallback_setInterfacer   s     r4   setOutgoingInterfacez#MulticastMixin.setOutgoingInterface_  s+     |##D))55d6HIIIr5   c                     t          j        |          }| j                             t           j        t           j        |           dS )NrL   )r#   	inet_atonr   r   r   )r.   r   r   s      r4   r   zMulticastMixin._setInterfacee  s7    T""v0&2H!LLLqr5   c                 `    | j                             t           j        t           j                  S rI   )r#   r   r   IP_MULTICAST_LOOPr:   s    r4   getLoopbackModezMulticastMixin.getLoopbackModej  s     {%%f&79QRRRr5   c                     t          j        dt          |                    }| j                            t          j        t          j        |           d S )Nb)r+   r   r   r#   r   r   r   )r.   modes     r4   setLoopbackModezMulticastMixin.setLoopbackModem  s?    {3T

++v0&2JDQQQQQr5   c                 `    | j                             t           j        t           j                  S rI   )r#   r   r   IP_MULTICAST_TTLr:   s    r4   getTTLzMulticastMixin.getTTLq  s     {%%f&79PQQQr5   c                     t          j        d|          }| j                            t          j        t          j        |           d S )NB)r+   r   r#   r   r   r   )r.   ttls     r4   setTTLzMulticastMixin.setTTLt  s9    k#s##v0&2I3OOOOOr5   r   c                 j    | j                             |                              | j        |d          S )zF
        Join a multicast group. Returns Deferred of success.
        rL   r1   r   r   
_joinAddr1r.   r   r   s      r4   	joinGroupzMulticastMixin.joinGroupx  /     |##D))55doyRSTTTr5   c                 j    | j                             |                              | j        ||          S rI   )r1   r   r   
_joinAddr2)r.   r   r   r   s       r4   r   zMulticastMixin._joinAddr1~  s-    |##I..::4?DRVWWWr5   c                 b   t          j        |          }t          j        |          }|rt           j        }nt           j        }	 | j                             t           j        |||z              d S # t          $ r4}t          j        t          j
        ||g|j        R            cY d }~S d }~ww xY wrI   )r#   r   IP_ADD_MEMBERSHIPIP_DROP_MEMBERSHIPr   r   rN   r   Failurer   MulticastJoinErrorr{   )r.   r   r   r   cmdes         r4   r   zMulticastMixin._joinAddr2  s    %%$Y//	 	,*CC+C	WK""6#4c4);KLLLLL 	W 	W 	W?5#;D)#Uaf#U#U#UVVVVVVVV	Ws   )A0 0
B.:)B)#B.)B.c                 j    | j                             |                              | j        |d          S )zD
        Leave multicast group, return Deferred of success.
        r   r   r   s      r4   
leaveGroupzMulticastMixin.leaveGroup  r   r5   N)r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r5   r4   r   r   V  s         6 6 6J J J  
S S SR R RR R RP P PU U U UX X X
W 
W 
WU U U U U Ur5   r   c                   (    e Zd ZdZ	 	 	 	 ddZd ZdS )	MulticastPortz.
    UDP Port that supports multicasting.
    r   r   NFc                 R    t                               | |||||           || _        d S rI   )r   r"   listenMultiple)r.   r   r/   r   r0   r1   r   s          r4   r"   zMulticastPort.__init__  s.     	dD%M7KKK,r5   c                    t                               |           }| j        rk|                    t          j        t          j        d           t          t          d          r+|                    t          j        t          j        d           |S )NrL   SO_REUSEPORT)	r   rJ   r   r   r#   r   SO_REUSEADDRr   r   )r.   r2   s     r4   rJ   zMulticastPort.createSocket  sq    %% 	JNN6,f.A1EEEv~.. Jv0&2EqIII
r5   )r   r   NF)r   r   r   r   r"   rJ   r   r5   r4   r   r     sO          
- 
- 
- 
-    r5   r   )&r   re   r#   r+   r   typingr   zope.interfacer   twisted.internetr   r   r   r   twisted.internet.abstractr	   r
   twisted.internet.iocpreactorr   r   r&   "twisted.internet.iocpreactor.constr   r   r   'twisted.internet.iocpreactor.interfacesr   twisted.pythonr   r   IListeningPortIUDPTransportISystemHandler!   r   r   IMulticastTransportr   r   r5   r4   <module>r     s              & & & & & & > > > > > > > > > > > > @ @ @ @ @ @ @ @ G G G G G G G G         
 E D D D D D ' ' ' ' ' ' ' ' 	 qT qT qT qT qT8 qT qT qTh	;U ;U ;U ;U ;U ;U ;U ;U| Z+,,    ND   -,  r5   