qmsk/net/socket/address.pxd
author Tero Marttila <terom@fixme.fi>
Tue, 18 Aug 2009 22:24:36 +0300
changeset 23 15d8bb96b8d4
parent 20 0e4933d5862e
child 27 12468e38227e
permissions -rw-r--r--
fix up addrinfo to hold a real platform.addrinfo, storing ai_addr/ai_canonname as objects
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
11
7ae92c2b433f move libc+py back to qmsk.net.x
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
     9
cimport qmsk.net.libc as libc
6
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    10
10
94b0d5a208c1 split up socket.platform
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
    11
cimport qmsk.net.socket.platform as platform
94b0d5a208c1 split up socket.platform
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
    12
6
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    13
cdef class sockaddr :
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    14
    """
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    15
        A network-level socket address
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    16
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    17
        XXX: rename to 'address'
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    18
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    19
        >>> sockaddr().family
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    20
        0
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    21
        >>> sockaddr().port
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    22
        Traceback (most recent call last):
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    23
          ...
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    24
        NotImplementedError
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    25
        >>> sockaddr().getnameinfo()
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    26
        Traceback (most recent call last):
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    27
          ...
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    28
        NotImplementedError
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    29
    """
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    30
    
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    31
    # address family
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    32
    # XXX: this should be a class constant! It's part of our type safety!
10
94b0d5a208c1 split up socket.platform
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
    33
    cdef readonly platform.sa_family_t family
6
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    34
10
94b0d5a208c1 split up socket.platform
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
    35
    cdef void _init_family (self, platform.sa_family_t family = ?)
6
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    36
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    37
    # get the sockaddr/socklen
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    38
    # each of these can be NULL to ignore it
10
94b0d5a208c1 split up socket.platform
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
    39
    cdef int _get_sockaddr (self, platform.sockaddr **sa_ptr, platform.socklen_t *sa_len) except -1
6
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    40
10
94b0d5a208c1 split up socket.platform
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
    41
    cdef platform.sockaddr* _get_sockaddr_ptr (self) except NULL
94b0d5a208c1 split up socket.platform
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
    42
    cdef platform.socklen_t _get_sockaddr_len (self) except -1
6
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    43
    
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    44
    # set the sockaddr, socklen must match
10
94b0d5a208c1 split up socket.platform
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
    45
    cdef int _set_sockaddr (self, platform.sockaddr *sa, size_t sa_len) except -1
6
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    46
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    47
# 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
    48
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
    49
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    50
cdef class addrinfo :
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    51
    """
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
    52
        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
    53
        
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
    54
        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
    55
        addrinfo struct.
6
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    56
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
    57
        >>> 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
    58
        >>> 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
    59
        >>> 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
    60
        >>> print addrinfo(addr=sockaddr_in())
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
    61
        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
    62
    """
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
    63
    
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
    64
    # 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
    65
    # 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
    66
    cdef platform.addrinfo ai
6
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    67
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
    68
    # 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
    69
    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
    70
    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
    71
   
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
    72
    # 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
    73
    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
    74
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
    75
    # 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
    76
    # 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
    77
    cdef _init_addrinfo (self, platform.addrinfo *ai)
6
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    78
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    79
# build and return a new addrinfo instance
10
94b0d5a208c1 split up socket.platform
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
    80
cdef addrinfo build_addrinfo (platform.addrinfo *c_ai)
6
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    81
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    82
cdef class endpoint :
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    83
    """
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    84
        A network-level socket endpoint. This is the level that humans mostly work with, but the tricky bit is that
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    85
        an endpoint can map to more than one sockaddr...
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    86
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    87
        Hence, endpoints are stored as human-readable hostname/service strings, which are then translated to sockaddrs
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    88
        using getaddrinfo.
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    89
8
b3880dafbab1 phew, things are working
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    90
        >>> from __future__ import absolute_import; import socket as _socket
6
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    91
        >>> e = endpoint('127.0.0.1', 80)
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    92
        >>> str(e)
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    93
        'hostname=127.0.0.1, service=80'
8
b3880dafbab1 phew, things are working
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    94
        >>> res = e.getaddrinfo(_socket.AF_UNSPEC, _socket.SOCK_STREAM)
6
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    95
        >>> len(res)
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    96
        1
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    97
        >>> str(res[0])
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    98
        '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
    99
        >>> e = endpoint('2001::5', 80)
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   100
        >>> str(e)
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   101
        'hostname=2001::5, service=80'
8
b3880dafbab1 phew, things are working
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   102
        >>> res = e.getaddrinfo(_socket.AF_UNSPEC, _socket.SOCK_STREAM)
6
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   103
        >>> len(res)
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   104
        1
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   105
        >>> str(res[0])
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   106
        '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
   107
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   108
    """
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   109
    
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   110
    # our defining attributes, set via __init__
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   111
    cdef object hostname, service
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   112
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   113
    cpdef getaddrinfo (self, int family, int socktype, int protocol = ?, int flags = ?)
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   114