Questo modulo fornisce un accesso all'interfaccia socket BSD. È disponibile su tutti i moderni sistemi Unix, Windows, MacOS, BeOS, OS/2 e probabilmente altre piattaforme.
Per un'introduzione alla programmazione dei socket (in C), leggere i seguenti libri: An Introductory 4.3BSD Interprocess Communication Tutorial, di Stuart Sechres e An Advanced 4.3BSD Interprocess Communication Tutorial, di Samuel J. Leffler et al, sia il Unix Programmer's Manual, Supplementary Documents 1 (sezione PS1:7 e PS1:8). I materiali di riferimento specifici per piattaforma per le varie chiamate di sistema relative ai socket sono un'ottima sorgente di informazioni sui dettagli della semantica dei socket. Per Unix, riferirsi alle pagine di manuale; per Windows, leggere le specifiche del WinSock (o WinSock 2). Per le API IPv6-ready, i lettori vorranno far riferimento all'RFC 2553 intitolato Basic Socket Interface Extensions for IPv6.
L'interfaccia Python è una traduzione diretta delle chiamate di sistema Unix e l'interfaccia di libreria per i socket in stile orientato agli oggetti di Python: la funzione socket() restituisce un oggetto socket i cui metodi implementano le varie chiamate di sistema dei socket. I tipi di parametro sono qualcosa di più alto livello rispetto all'interfaccia C: simile alle operazioni read() e write() sui file Python, l'allocazione del buffer sulle operazioni di ricezione è automatica, e la lunghezza del buffer è implicita nelle operazioni di invio.
Gli indirizzi socket sono indicati come a seguito: una singola stringa
è usata per la famiglia di indirizzi AF_UNIX. Una coppia
(host, porta)
è usata per la famiglia di indirizzi
AF_INET, dove host è una stringa rappresentante un
hostname nella notazione dei domini Internet come
'daring.cwi.nl'
o un indirizzo IPv4 come '100.50.200.5'
,
mentre porta è un numero di porta intero. Per la famiglia di
indirizzi AF_INET6, viene usata una tupla quadrupla
(host, porta, flowinfo, scopeid)
, dove
flowinfo e scopeid indicano i membri sin6_flowinfo
e sin6_scope_id
nella struttura struct sockaddr_in6
del C. Per i metodi del modulo socket, flowinfo e
scopeid possono essere omessi solo per
retrocompatibilità. Notare, comunque, che l'omissione di scopeid
può causare problemi nella manipolazione di indirizzi IPv6. Altre
famiglie di indirizzi non sono attualmente sopportate. Il formato
dell'indirizzo richiesto da un particolare oggetto socket è
automaticamente selezionato in base alla famiglia di indirizzi
specificata quando l'oggetto socket è stato creato.
Per gli indirizzi IPv4, sono accettate due forme speciali al posto di
un indirizzo di un host: la stringa vuota rappresenta
INADDR_ANY, e la stringa '<broadcast>'
rappresenta
INADDR_BROADCAST. Il comportamento non è disponibile con
IPv6 per retrocompatibilità, quindi, si potrebbe volerle evitare se
si ha l'intenzione di supportare IPv6 nei propri programmi Python.
Se si usa un hostname in un segmento di rete composto da indirizzi socket IPv4/v6, il programma potrebbe mostrare un comportamento non deterministico, visto che Python usa il primo indirizzo restituito dalla risoluzione DNS. L'indirizzo socket sarebbe risolto differentemente in un attuale indirizzo IPv4/v6 reale, a seconda dei risultati della risoluzione DNS e/o la configurazione dell'host. Per un comportamento deterministico usare un indirizzo numerico nel segmento di rete.
Tutti gli errori sollevano eccezioni. Possono essere sollevate le consuete eccezioni per tipi di argomento non validi e condizioni di out-of-memory; errori relativi ai socket o alla semantica degli indirizzi sollevano l'errore socket.error.
La modalità non bloccante è supportata attraverso setblocking(). Una sua generalizzazione basata sui timeout è supportata attraverso settimeout().
Il modulo socket esporta le seguenti costanti e funzioni:
(errno, string)
che
rappresenta un errore restituito da una chiamata di sistema, simile al
valore che accompagna os.error. Vedere il modulo
errno, che contiene nomi per i codici
di errore definiti dal sistema operativo sottostante.
Il valore che la accompagna è una coppia
(h_errno, string)
che rappresenta un errore
restituito da una chiamata di libreria. string rappresenta la
descrizione di h_errno, come restituito dalla funzione C
hstrerror().
Il valore di error corrisponderà con una delle costanti
EAI_* definite in questo modulo.
(error, string)
che
rappresenta un errore restituito da una chiamata di
libreria. string rappresenta la descrizione di error, come
restituito dalla funzione C gai_strerror().
host, porta[, family[, socktype[, proto[, flags]]]]) |
None
.
porta è una stringa contente il nome di un servizio (come
'http'
), una rappresentazione numerica del numero della porta
oppure None
.
Il resto degli argomenti sono facoltativi e devono essere numerici se
specificati. Per host e porta, devono essere passate una
stringa vuota o None
, è possibile passare NULL
all'API C. La
funzione getaddrinfo() restituisce una lista di tuple di 5
elementi con la seguente struttura:
(family, socktype, proto, canonname,
sockaddr)
family, socktype e proto sono tutti interi che devono essere passati alla funzione socket(). canonname è una stringa rappresentante il nome canonico dell'host. Può essere un indirizzo numerico IPv4/v6 quando AI_CANONNAME viene specificato per un host numerico. sockaddr è una tupla che descrive un indirizzo socket, come descritto sopra. Leggere i sorgenti di httplib ed altri moduli di libreria per un utilizzo tipico della funzione. Nuovo nella versione 2.2.
[nome]) |
hostname) |
'100.50.200.5'
. Se
l'host name è esso stesso un indirizzo IPv4 viene restituito
invariato. Vedere gethostbyname_ex() per un'interfaccia
più completa. gethostbyname() non supporta la risoluzione
dei nomi IPv6m e getaddrinfo() dovrebbe essere usata al suo
posto per il supporto al dual stack IPv4/v6.
hostname) |
(hostname, aliaslist, ipaddrlist)
dove
hostname è il nome dell'host primario in risposta
all'ip_address dato, aliaslist è una lista (che può essere
vuota) di hostname alternativi per lo stesso indirizzo, e
ipaddrlist è una lista di indirizzi IPv4 per la stessa
interfaccia sullo stesso host (spesso ma non sempre un singolo
indirizzo). gethostbyname_ex() non supporta la risoluzione
dei nomi IPv6, e dovrebbe essere usata getaddrinfo() per il
supporto al dual stack IPv4/v6.
) |
gethostbyname(gethostname())
. Questa operazione assume che ci
sia una valida reciprocità tra l'indirizzo dell'host e l'host, e
questo non sempre avviene.
Notare: gethostname() non restituisce sempre il nome di
dominio pienamente qualificato; usare
gethostbyaddr(gethostname())
(vedere sotto).
ip_address) |
(hostname, aliaslist,
ipaddrlist)
dove hostname è il nome dell'host primario
che risponde all'indirizzo ip_address dato, aliaslist è
una lista (che può essere vuota) di nomi di host alternativi per lo
stesso indirizzo, e ipaddrlist è una lista di indirizzi IPv4/v6
per la stessa interfaccia sullo stesso host (che più facilmente
contiene solo un singolo indirizzo).
Per trovare il nome di dominio pienamente qualificato, usare la
funzione getfqdn().
gethostbyaddr supporta sia IPv4 che IPv6.
sockaddr, opzioni) |
(host, porta)
.
A seconda delle impostazioni delle opzioni, il risultato può
contenere un nome di dominio pienamente qualificato o una
rappresentazione numerica dell'indirizzo in host. In modo
simile porta può contenere una stringa con il nome della porta o
la rappresentazione numerica del numero della porta.
Nuovo nella versione 2.2.
protocolname) |
'icmp'
)
in una costante adatta per essere passata come terzo argomento
(facoltativo) della funzione socket(). Solitamente serve solo
per socket aperti in modalità ``raw'' (SOCK_RAW); per le
normali modalità adottate con i socket, il protocollo corretto è
scelto automaticamente se è omesso oppure zero.
servicename, protocolname) |
'tcp'
o 'udp'
.
[family[, type[, proto]]]) |
sock[, keyfile, certfile]) |
Questa funzione non effettua nessuna verifica di certificazione!
fd, family, type[, proto]) |
x) |
x) |
x) |
x) |
ip_string) |
Se la stringa dell'indirizzo passata a questa funzione non è valida, verrà sollevata un'eccezione socket.error. Notare che la validità dipende dall'implementazione sottostante in C di inet_aton().
inet_aton() non supporta IPv6, dovrebbe essere usata al suo posto getnameinfo() per il supporto al dual stack IPv4/v6.
packed_ip) |
Se la stringa passata a questa funzione non è esattamente di 4 byte, verrà sollevata un'eccezione socket.error. inet_ntoa() non supporta l'IPv6, dovrebbe essere usata al suo posto getnameinfo() per il supporto al dual stack IPv4/v6.
address_family, ip_string) |
I valori supportati per address_family sono al momento AF_INET e AF_INET6. Se la stringa di indirizzo IP ip_string non è valida, verrà sollevata un'eccezione socket.error. Notare che la validità dipende sia dal valore di address_family che dall'implementazione sottostante di inet_pton().
Disponibilità: Unix (forse non tutte le piattaforme). Nuovo nella versione 2.3.
address_family, packed_ip) |
'7.10.0.5'
or
'5aef:2b::8'
)).
inet_ntop() è utile quando una libreria o protocollo di
rete restituisce un oggetto di tipo
struct in_addr (simile a inet_ntoa()) o
struct in6_addr.
I valori supportati per address_family sono attualmente AF_INET e AF_INET6. Se la stringa packed_ip non è della lunghezza corretta per la specifica famiglia di indirizzi, sarà sollevata un'eccezione ValueError. Per gli errori provenienti dalla chiamata a inet_ntop() sarà sollevata un'eccezione socket.error.
Disponibilità: Unix (forse non tutte le piattaforme). Nuovo nella versione 2.3.
) |
None
indica che i nuovi oggetti
socket non hanno timeout. Quando il modulo socket è appena importato,
il suo valore predefinito è None
.
Nuovo nella versione 2.3.
timeout) |
None
indica che i nuovi oggetti
socket non hanno timeout. Quando il modulo socket è appena importato, il
suo valore predefinito è None
.
Nuovo nella versione 2.3.
type(socket(...))
.
Vedete anche: