Pythonネットワークプログラミング-socket(一)

6983 ワード

11.1.1   ,         
                                 。
                   :   (address family)     OSI     ,   (socket type)       。
Python       。     AF_INET,  IPv4 Internet  。AF_INET6  IPv6 Internet  。
AF_UNIX UNIX    (UNIX Domain Sockets, UDS)    ,    POSIX             。UDS                       ,       。
UDS           。    IPC,  UDS     ,  IP             。
        SOCK_DGRAM SOCK_STREAM,SOCK_DGRAM  UDP,SOCK_stream  TCP。UDP         ,     ,TCP           ,           。        ,         。              (HTTP)     TCP   ,UDP             , DNS    。

        
socket                 ,                        。                          ,              。
import socket
print socket.gethostname()
                 。
>>> ================================ RESTART ================================
>>> 
ruby
  gethostbyname()           API,              。
import socket
for host in ['homer', 'www', 'www.python.org','www.caoqing123.com']:
    try:
        print '%s : %s' % (host,socket.gethostbyname(host))
    except socket.error, msg:
        print '%s : %s' % (host, msg)
       DNS              ,            。        ,   socket error     。
>>> ================================ RESTART ================================
>>> 
homer : [Errno 11004] getaddrinfo failed
www : 121.14.228.36
www.python.org : 82.94.164.162
www.caoqing123.com : [Errno 11004] getaddrinfo failed
           ,      gethostname_ex(),             ,    ,                 IP  。
import socket
for host in ['homer', 'www', 'www.python.org','www.caoqing123.com']:
    print host
    try:
        hostname, alias, address = socket.gethostbyname_ex(host)
        print 'Hostname    :', hostname
        print 'alias    :', alias
        print 'address    :', address
    except socket.error as msg:
        print 'ERROR:', msg
    print
                ,                    。
>>> ================================ RESTART ================================
>>> 
homer
ERROR: [Errno 11004] getaddrinfo failed

www
Hostname    : 1st.dtwscache.glb0.lxdns.com
alias    : ['www.zte.com.cn', 'www.zte.com.cn.cdn20.com']
address    : ['61.146.152.58', '121.14.228.36', '121.14.35.233']

www.python.org
Hostname    : www.python.org
alias    : []
address    : ['82.94.164.162']

www.caoqing123.com
ERROR: [Errno 11004] getaddrinfo failed
  getfqdn()                 。
import socket
for host in ['homer', 'www', 'www.python.org','www.caoqing123.com']:
    print '%6s : %s' % (host, socket.getfqdn(host))
          ,               。
>>> ================================ RESTART ================================
>>> 
 homer : homer
   www : www
www.python.org : dinsdale.python.org
www.caoqing123.com : www.caoqing123.com
           ,    gethostbyaddr()              。
import socket
hostname, alias, address = socket.gethostbyaddr('192.168.27.91')
print 'Hostname     :', hostname
print 'Alias        :', alias
print 'Address      :', address

      
  IP   ,               ,                    IP  ,                   。
    IP  ,      ,             ,                   。
                getservbyname()  。
import socket
from urlparse import urlparse
for url in ['http://www.python.org',
            'https://caoqing.com',
            'pop3://xiaohuan.com',
            'smtp://xiaobao.com',
            ]:
    parse_url = urlparse(url)
    port = socket.getservbyname(parse_url.scheme)
    print '%6s : %s' % (parse_url.scheme, port)
>>> ================================ RESTART ================================
>>> 
  http : 80
 https : 443
  pop3 : 110
  smtp : 25
           ,    getservbyport()。
import socket
import urlparse
for port in [80, 443, 110, 25]:
    print urlparse.urlunparse(
        (socket.getservbyport(port), 'caoqing.com', '/', '', '', '')
        )
          URL,          。        
>>> ================================ RESTART ================================
>>> 
http://caoqing.com/
https://caoqing.com/
pop3://caoqing.com/
smtp://caoqing.com/
    getprotobyname()               。
import socket
def get_constants(prefix):
    return dict( (getattr(socket, n), n)
                 for n in dir(socket)
                 if n.startswith(prefix)
                 )
protocols = get_constants('IPPROTO_')
for name in ['icmp', 'udp', 'tcp']:
    proto_num = socket.getprotobyname(name)
    const_name = protocols[proto_num]
    print '%4s -> %2d (socket.%-12s = %2d)' % \
          (name, proto_num, const_name, getattr(socket, const_name))
         ,     socket   ,         IPPROTO_。          
>>> ================================ RESTART ================================
>>> 
icmp ->  1 (socket.IPPROTO_ICMP =  1)
 udp -> 17 (socket.IPPROTO_UDP  = 17)
 tcp ->  6 (socket.IPPROTO_TCP  =  6)
 
       
getaddrinfo()                   ,                 。           ,           。
import socket
def get_constants(prefix):
    return dict( (getattr(socket, n), n)
                 for n in dir(socket)
                 if n.startswith(prefix)
                 )
families = get_constants('AF_')
types = get_constants('SOCK_')
protocols = get_constants('IPPROTO_')
for response in socket.getaddrinfo('www.python.org', 'http'):
    family, socktype, proto, canonname, sockaddr = response
    print 'Family   :', families[family]
    print 'Type     :', types[socktype]
    print 'Protocol :', protocols[proto]
    print 'Canoniocal name :', canonname
    print 'Socket address :', sockaddr
    print 
       www.python.org     。
>>> ================================ RESTART ================================
>>> 
Family   : AF_INET
Type     : SOCK_STREAM
Protocol : IPPROTO_IP
Canoniocal name : 
Socket address : ('82.94.164.162', 80)
getaddrinfo()            。host port     。     family,socktype,proto flags。        0 socket       。

 IP    
 C             struct sockaddr IP         。 C   Python      IPV4  ,    inet_aton() inet_ntoa()。
import socket
import binascii
import struct
import sys
for string_address in ['127.0.0.1']:
    packed = socket.inet_aton(string_address)
    print 'Original :', string_address
    print 'Packed   :', binascii.hexlify(packed)
    print 'Unpacked :', socket.inet_ntoa(packed)
    print
                C ,         。
>>> ================================ RESTART ================================
>>> 
Original : 127.0.0.1
Packed   : 7f000001
Unpacked : 127.0.0.1
  inet_aton inet_ntoa    IPv4 IPv6  ,                 。