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

2024-05-16 03:09:40 发布

您现在位置:Python中文网/ 问答频道 /正文

当我打开类似Python的网络连接时

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('www.heise.de', 80))

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

netstat --all --program|grep <PID>
tcp   0  0 10.10.10.6:39328   www.heise.de:http  VERBUNDEN  23829/python

但是我怎么能读取这个连接状态,连接,关闭等等。。。从Python内部?阅读socket documentation并没有给我任何提示。


Tags: stream状态wwwconnectdesocketallprogram
3条回答

这仅适用于Linux:

你需要打个电话。级别为“IPPROTO_TCP”,选项为“TCP_INFO”, 如tcp manual所建议。它将以 在定义的here中,还可以找到状态值的枚举。

您可以尝试以下示例:

    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)

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

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

在Linux上,可以使用getsockopt(2)TCP_INFO选项来了解连接的状态。

我刚刚把这个问题的一半解决方案用胶带粘在一起,以防谷歌把其他人带到这里来。

import urllib2
import psutil

page = urllib2.urlopen(URL) # dummy URL
sock = page.fp              # The socket object that's being held open
fileno = sock.fileno()

proc = psutil.Process()
connections = proc.connections()
matches = [x for x in connections if x.fd == fileno]
if not matches:
    status = None
else:
    assert len(matches) == 1
    match = matches[0]
    status = match.status

一旦识别出这个套接字,该怎么做仍然是待定的。

相关问题 更多 >