qmsk/net/socket/address.pxd
author Tero Marttila <terom@fixme.fi>
Fri, 25 Sep 2009 21:34:04 +0300
changeset 49 e2f79e68418a
parent 46 64b4ffb44754
permissions -rw-r--r--
fix up circular cimports related to the sockaddr type, and touch up endpoint/getaddrinfo a bit
6
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
"""
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
    Socket addresses at various levels:
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
        sockaddr    - specific network-level address for socket operations
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     5
        addrinfo    - information on a specific sockaddr including its socket parameters
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     6
        endpoint    - human-readable network address, corresponding to multiple sockaddr's
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     7
"""
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     8
10
94b0d5a208c1 split up socket.platform
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
     9
cimport qmsk.net.socket.platform as platform
94b0d5a208c1 split up socket.platform
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
    10
49
e2f79e68418a fix up circular cimports related to the sockaddr type, and touch up endpoint/getaddrinfo a bit
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
    11
from qmsk.net.socket._address cimport sockaddr
6
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    12
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    13
# build a sockaddr from the given sockaddr struct, based on sa_family
10
94b0d5a208c1 split up socket.platform
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
    14
cdef sockaddr build_sockaddr (platform.sockaddr *sa, size_t sa_len)
6
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    15
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    16
cdef class addrinfo :
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    17
    """
23
15d8bb96b8d4 fix up addrinfo to hold a real platform.addrinfo, storing ai_addr/ai_canonname as objects
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
    18
        A socket-level endpoint address, which contains the full socket parameters and an bind/connect address.
15d8bb96b8d4 fix up addrinfo to hold a real platform.addrinfo, storing ai_addr/ai_canonname as objects
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
    19
        
15d8bb96b8d4 fix up addrinfo to hold a real platform.addrinfo, storing ai_addr/ai_canonname as objects
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
    20
        A full addrinfo struct is stored, but ai_canonname and ai_addr are stored as (optional) objects outside of the
15d8bb96b8d4 fix up addrinfo to hold a real platform.addrinfo, storing ai_addr/ai_canonname as objects
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
    21
        addrinfo struct.
30
0e0b9bc2c96b fix doctests
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
    22
        
0e0b9bc2c96b fix doctests
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
    23
        >>> from qmsk.net.socket import af_inet
23
15d8bb96b8d4 fix up addrinfo to hold a real platform.addrinfo, storing ai_addr/ai_canonname as objects
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
    24
        >>> ai = addrinfo()
15d8bb96b8d4 fix up addrinfo to hold a real platform.addrinfo, storing ai_addr/ai_canonname as objects
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
    25
        >>> ai.addr
15d8bb96b8d4 fix up addrinfo to hold a real platform.addrinfo, storing ai_addr/ai_canonname as objects
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
    26
        >>> ai.canonname
30
0e0b9bc2c96b fix doctests
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
    27
        >>> print addrinfo(addr=af_inet.sockaddr_in())
23
15d8bb96b8d4 fix up addrinfo to hold a real platform.addrinfo, storing ai_addr/ai_canonname as objects
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
    28
        family=0, socktype=0, protocol=0, addr=0.0.0.0:0, canonname=None
15d8bb96b8d4 fix up addrinfo to hold a real platform.addrinfo, storing ai_addr/ai_canonname as objects
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
    29
    """
15d8bb96b8d4 fix up addrinfo to hold a real platform.addrinfo, storing ai_addr/ai_canonname as objects
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
    30
    
15d8bb96b8d4 fix up addrinfo to hold a real platform.addrinfo, storing ai_addr/ai_canonname as objects
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
    31
    # canonname is not stored
15d8bb96b8d4 fix up addrinfo to hold a real platform.addrinfo, storing ai_addr/ai_canonname as objects
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
    32
    # may be NULL
15d8bb96b8d4 fix up addrinfo to hold a real platform.addrinfo, storing ai_addr/ai_canonname as objects
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
    33
    cdef platform.addrinfo ai
6
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    34
23
15d8bb96b8d4 fix up addrinfo to hold a real platform.addrinfo, storing ai_addr/ai_canonname as objects
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
    35
    # may be NULL
15d8bb96b8d4 fix up addrinfo to hold a real platform.addrinfo, storing ai_addr/ai_canonname as objects
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
    36
    cdef sockaddr ai_addr
15d8bb96b8d4 fix up addrinfo to hold a real platform.addrinfo, storing ai_addr/ai_canonname as objects
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
    37
    cdef object ai_canonname
15d8bb96b8d4 fix up addrinfo to hold a real platform.addrinfo, storing ai_addr/ai_canonname as objects
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
    38
   
15d8bb96b8d4 fix up addrinfo to hold a real platform.addrinfo, storing ai_addr/ai_canonname as objects
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
    39
    # update self.ai.ai_* to reflect self.ai_*
15d8bb96b8d4 fix up addrinfo to hold a real platform.addrinfo, storing ai_addr/ai_canonname as objects
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
    40
    cdef _init_ai_members (self)
15d8bb96b8d4 fix up addrinfo to hold a real platform.addrinfo, storing ai_addr/ai_canonname as objects
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
    41
15d8bb96b8d4 fix up addrinfo to hold a real platform.addrinfo, storing ai_addr/ai_canonname as objects
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
    42
    # set the contents of self.ai from the given real addrinfo
15d8bb96b8d4 fix up addrinfo to hold a real platform.addrinfo, storing ai_addr/ai_canonname as objects
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
    43
    # this ignores the ai_canonname attribute
15d8bb96b8d4 fix up addrinfo to hold a real platform.addrinfo, storing ai_addr/ai_canonname as objects
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
    44
    cdef _init_addrinfo (self, platform.addrinfo *ai)
6
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    45
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    46
# build and return a new addrinfo instance
10
94b0d5a208c1 split up socket.platform
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
    47
cdef addrinfo build_addrinfo (platform.addrinfo *c_ai)
6
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    48
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    49
cdef class endpoint :
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    50
    """
49
e2f79e68418a fix up circular cimports related to the sockaddr type, and touch up endpoint/getaddrinfo a bit
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
    51
        XXX: silly abstraction, just use the getaddrinfo function
6
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    52
49
e2f79e68418a fix up circular cimports related to the sockaddr type, and touch up endpoint/getaddrinfo a bit
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
    53
        >>> from qmsk.net.socket.constants import *
6
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    54
        >>> e = endpoint('127.0.0.1', 80)
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    55
        >>> str(e)
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    56
        'hostname=127.0.0.1, service=80'
49
e2f79e68418a fix up circular cimports related to the sockaddr type, and touch up endpoint/getaddrinfo a bit
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
    57
        >>> res = e.getaddrinfo(AF_UNSPEC, SOCK_STREAM)
6
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    58
        >>> len(res)
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    59
        1
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    60
        >>> str(res[0])
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    61
        'family=2, socktype=1, protocol=6, addr=127.0.0.1:80, canonname=None'
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    62
        >>> e = endpoint('2001::5', 80)
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    63
        >>> str(e)
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    64
        'hostname=2001::5, service=80'
49
e2f79e68418a fix up circular cimports related to the sockaddr type, and touch up endpoint/getaddrinfo a bit
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
    65
        >>> res = e.getaddrinfo(AF_UNSPEC, SOCK_STREAM)
6
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    66
        >>> len(res)
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    67
        1
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    68
        >>> str(res[0])
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    69
        'family=10, socktype=1, protocol=6, addr=[2001::5]:80, canonname=None'
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    70
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    71
    """
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    72
    
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    73
    # our defining attributes, set via __init__
30
0e0b9bc2c96b fix doctests
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
    74
    cdef public object hostname, service
6
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    75