Socket & Python 3

In informatica e nei sistemi operativi moderni un socket è un’astrazione software progettata per poter utilizzare delle API standard e condivise per la trasmissione e la ricezione di dati attraverso una rete
oppure come meccanismo di IPC.
È il punto in cui il codice applicativo di un processo accede al canale di comunicazione per mezzo di una porta, ottenendo una comunicazione tra processi che lavorano su due macchine fisicamente separate.
Dal punto di vista di un programmatore un socket è un particolare oggetto sul quale leggere e scrivere i dati da trasmettere o ricevere.
(fonte wikipedia)

In generale, si definisce socket una rappresentazione a livello software utilizzata per interfacciare i due terminali in gioco in una connessione tra due computer.

Vediamo oggi un semplice esempio di come si crea un socket in Python (v.3.5) e di come si puo’ usarlo per comunicare con un altro pc, in questo caso un web server remoto.

Quando digitiamo http://www.freenixsecurity.net nella riga degli indirizzi del browser, questo sta creando proprio un socket attraverso cui si potrà collegare al server di freenix che si trova dall’altro capo,
cioè sul computer remoto e precisamente sulla porta 80 riservata alle connessioni http.

Iniziamo aprendo IDLE, la GUI di Python, cioè scrivendo:

Python

Per creare un socket usiamo la funzione socket.socket del modulo socket, dunque importiamo il modulo:

>>> import socket
>>> mysocket=socket.socket()

ed ora indichiamo il sito di freenixsecurity cui vogliamo connetterci e visualizziamo il risultato con print:

>>> mysocket.connect(("www.freenixsecurity.net",80))
>>> print(mysocket)
 
<socket.socket fd=260, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('192.168.1.4', 58817), raddr=('185.81.2.86', 80)>
>>>

A connessione stabilita, il socket è usato per trasferire i dati relativi alla pagina che vogliamo visualizzare.
Da come si nota nella risposta, il socket ha dei parametri che sono relativi alla famiglia di indirizzi con cui vogliamo lavorare (es. ipv4) ed alla tipologia del socket stesso (es. protocollo TCP)

Una volta connessi possiamo scrivere:

>>> myrequest="GET / HTTP/1.1\nHost: www.freenixsecurity.net\n\n"
>>> mysocket.send(myrequest.encode('utf-8'))

in questo modo evidentemente passiamo la richiesta HTTP GET a send() per l’invio, dove encode() caratterizza il tipo di codifica

ora che abbiamo mandato la richiesta possiamo leggerne la risposta:

>>> myresponse=mysocket.recv(4096)

dove 4096 è la quantità del buffer size.

Se ora scriviamo:

>>> myresponse

possiamo visualizzare i primi 4096 byte della pagina html di freenix.

Ora possiamo chiudere il nostro socket con:

>>> mysocket.close()

Alla prossima 🙂

Author: vic2

sviluppatore full stack
linguaggi Java, Python, Javascript, C#, Php
framework Jhipster, Django, AngularJS, Ionic, Unity 3D
amatore del networking