Skip to content

Instantly share code, notes, and snippets.

@maliubiao
Created September 25, 2014 11:41
Show Gist options
  • Save maliubiao/44dc14aee59d5982a120 to your computer and use it in GitHub Desktop.
Save maliubiao/44dc14aee59d5982a120 to your computer and use it in GitHub Desktop.
获取一个socket的相关信息。
import socket
import cStringIO
import struct
def parse_struct(b, fmt):
d = {}
fmts = "".join([x[1] for x in fmt])
raw = b.read(struct.calcsize(fmts))
raw = struct.unpack(fmts, raw)
for i, item in enumerate(fmt):
d[item[0]]= raw[i]
return d
tcp_info = (
("state", "B"),
("ca_state", "B"),
("retransmits", "B"),
("probes", "B"),
("backoff", "B"),
("options", "B"),
("snd_wscale", "B"),
("rto", "I"),
("ato", "I"),
("snd_mss", "I"),
("rcv_mss", "I"),
("unpacked", "I"),
("sacked", "I"),
("lost", "I"),
("retrans", "I"),
("fackets", "I"),
("last_data_sent", "I"),
("last_ack_sent", "I"),
("last_data_recv", "I"),
("last_ack_recv", "I"),
("mtu", "I"),
("rcv_ssthresh", "I"),
("rtt", "I"),
("rttvar", "I"),
("snd_ssthresh", "I"),
("snd_cwnd", "I"),
("advmss", "I"),
("reordering", "I"),
("rcv_rtt", "I"),
("rcv_space", "I"),
("total_retrans", "I")
)
def get_tcp_info(sock):
size = struct.calcsize("".join([x[1] for x in tcp_info]))
raw = sock.getsockopt(socket.IPPROTO_TCP, socket.TCP_INFO, size)
info = parse_struct(cStringIO.StringIO(raw), tcp_info)
info["rcv_wscale"] = info["snd_wscale"] & 0xf
info["snd_wscale"] >>= 4
return info
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment