Ho uno script Python che crea molte connessioni simultanee di breve durata utilizzando la libreria requests. Ho specificamente bisogno di trovare la porta sorgente utilizzata da ciascuna connessione e immagino di aver bisogno di accedere al socket sottostante per quello. C'è un modo per ottenere questo attraverso l'oggetto risposta?Come ottenere il socket sottostante quando si usano le richieste Python
risposta
Per i collegamenti di streaming (quelli aperti con il parametro stream=True
), è possibile chiamare il metodo .raw.fileno()
sull'oggetto risposta per ottenere un descrittore di file aperto.
È possibile utilizzare il metodo socket.fromfd(...)
per creare un oggetto socket Python dal descrittore:
>>> import requests
>>> import socket
>>> r = requests.get('http://google.com/', stream=True)
>>> s = socket.fromfd(r.raw.fileno(), socket.AF_INET, socket.SOCK_STREAM)
>>> s.getpeername()
('74.125.226.49', 80)
>>> s.getsockname()
('192.168.1.60', 41323)
Per socket non di streaming, il descrittore di file viene ripulito prima che l'oggetto di risposta viene restituito. Per quanto posso dire, non c'è modo di farlo in questa situazione.
Questo funziona benissimo. Ho scoperto che se uso il tuo metodo all'interno della callback "response" posso farlo anche con richieste non streaming. – Elektito
Un'alternativa potrebbe essere In windows 'netstat -a' può elencare tutti i processi con gli esseri di porte utilizzati. È possibile codificare uno script python per ottenere l'output di questo comando e quindi eseguire il lavoro ulteriore. Non è così difficile. Non è sicuro se questo può essere fatto dalla lib 'requests'. –
Ci sono molte connessioni simultanee di breve durata nel mio programma. Non c'è modo di sapere quale porta appartiene a quale connessione. – Elektito
È possibile recuperare tutte le porte utilizzate dall'applicazione, ma non è possibile utilizzare alcun comando incorporato (Windows) per individuare la connessione dell'applicazione che utilizza il numero di porta. Vorrei suggerire di chiedere in Superuser.com –