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 , 。