qmsk/net/socket/address.pxd
author Tero Marttila <terom@fixme.fi>
Sun, 23 Aug 2009 22:31:12 +0300
changeset 30 0e0b9bc2c96b
parent 27 12468e38227e
child 46 64b4ffb44754
permissions -rw-r--r--
fix doctests
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
27
12468e38227e [socket] add sockaddr_un (still dysfunctional\!) + doc fixes
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    16
        
12468e38227e [socket] add sockaddr_un (still dysfunctional\!) + doc fixes
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    17
        XXX: not abstract enough. Functions/properties like getnameinfo/addr/port do not work for e.g. sockaddr_un
6
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.
30
0e0b9bc2c96b fix doctests
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
    56
        
0e0b9bc2c96b fix doctests
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
    57
        >>> 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
    58
        >>> 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
    59
        >>> 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
    60
        >>> ai.canonname
30
0e0b9bc2c96b fix doctests
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
    61
        >>> 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
    62
        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
    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
    
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
    # 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
    66
    # 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
    67
    cdef platform.addrinfo ai
6
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    68
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
    69
    # 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
    70
    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
    71
    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
    72
   
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
    # 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
    74
    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
    75
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
    # 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
    77
    # 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
    78
    cdef _init_addrinfo (self, platform.addrinfo *ai)
6
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    79
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    80
# build and return a new addrinfo instance
10
94b0d5a208c1 split up socket.platform
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
    81
cdef addrinfo build_addrinfo (platform.addrinfo *c_ai)
6
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    82
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    83
cdef class endpoint :
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    84
    """
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    85
        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
    86
        an endpoint can map to more than one sockaddr...
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    87
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    88
        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
    89
        using getaddrinfo.
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    90
8
b3880dafbab1 phew, things are working
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    91
        >>> from __future__ import absolute_import; import socket as _socket
6
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    92
        >>> e = endpoint('127.0.0.1', 80)
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    93
        >>> str(e)
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    94
        'hostname=127.0.0.1, service=80'
8
b3880dafbab1 phew, things are working
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    95
        >>> res = e.getaddrinfo(_socket.AF_UNSPEC, _socket.SOCK_STREAM)
6
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    96
        >>> len(res)
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    97
        1
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    98
        >>> str(res[0])
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    99
        '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
   100
        >>> e = endpoint('2001::5', 80)
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   101
        >>> str(e)
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   102
        'hostname=2001::5, service=80'
8
b3880dafbab1 phew, things are working
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   103
        >>> res = e.getaddrinfo(_socket.AF_UNSPEC, _socket.SOCK_STREAM)
6
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   104
        >>> len(res)
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   105
        1
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   106
        >>> str(res[0])
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   107
        '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
   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
    
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   111
    # our defining attributes, set via __init__
30
0e0b9bc2c96b fix doctests
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
   112
    cdef public object hostname, service
6
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   113
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   114
    cpdef getaddrinfo (self, int family, int socktype, int protocol = ?, int flags = ?)
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   115