在Python中查询TCP套接字连接状态

Mic*_*ael 6 python sockets networking tcp

当我在Python中打开网络连接时

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('www.heise.de', 80))
Run Code Online (Sandbox Code Playgroud)

我可以从控制台读取连接状态:

netstat --all --program|grep <PID>
tcp   0  0 10.10.10.6:39328   www.heise.de:http  VERBUNDEN  23829/python
Run Code Online (Sandbox Code Playgroud)

但是如何从Python中读取此连接状态,CONNECTED,CLOSE_WAIT ...... 通过套接字文档阅读没有给我任何暗示.

vah*_*dne 8

这仅适用于Linux:

你需要getsockopt调用.level是"IPPROTO_TCP",选项是"TCP_INFO",如tcp手册所示.它将返回此处定义的tcp_info数据,您还可以其中找到STATE值的枚举.

你可以尝试这个样本:

    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)
Run Code Online (Sandbox Code Playgroud)

你要找的是打印元组中的第一项(整数).您可以使用tcp_info定义交叉检查结果.

注意:tcp_info的大小应该是104,但我使用92,不知道发生了什么,但它对我有用.

  • `struct.unpack( "B"*7 + "I"*24,s.getsockopt(socket.SOL_TCP,socket.TCP_INFO,104))`是更完整根据[此](HTTP://lxr.free- electrons.com/source/include/uapi/linux/tcp.h#L148) (6认同)