When I'm opening a network connection in Python like
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('www.heise.de', 80))
I can read the connection state from the console:
netstat --all --program|grep <PID>
tcp 0 0 10.10.10.6:39328 www.heise.de:http VERBUNDEN 23829/python
But how can I read this connection state, CONNECTED, CLOSE_WAIT, ... from within Python? Reading through the socket documentation didn't give me any hint on that.
This is only for Linux:
You need getsockopt call. level is "IPPROTO_TCP" and option is "TCP_INFO", as suggested by tcp manual. It is going to return the tcp_info data as defined here where you can also find the enumeration for STATE values.
you can try this sample:
import socket
import struct
def getTCPInfo(s):
fmt = "B"*7+"I"*21
x = struct.unpack(fmt, s.getsockopt(socket.IPPROTO_TCP, socket.TCP_INFO, 92))
print x
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
getTCPInfo(s)
s.connect(('www.google.com', 80))
getTCPInfo(s)
s.send("hi\n\n")
getTCPInfo(s)
s.recv(1024)
getTCPInfo(s)
what you are looking for is the First item (integer) in the printed tuple. You can cross check the result with the tcp_info definition.
Note: size of tcp_info should be 104 but i got it working with 92, not sure what happened but it worked for me.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With