9

当我在 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 中读取这个连接状态,CONNECTED,CLOSE_WAIT,...?通读套接字文档并没有给我任何提示。

4

3 回答 3

11

这仅适用于Linux

你需要getsockopt电话。级别为"IPPROTO_TCP",选项为"TCP_INFO" ,如tcp manual所建议的那样。它将返回此处定义的tcp_info数据,您还可以在其中找到状态值的枚举。

你可以试试这个样本:

    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,不知道发生了什么,但它对我有用。

于 2013-08-12T14:11:09.050 回答
1

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

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

识别出此套接字后要做什么仍待定。

于 2015-09-12T19:12:08.003 回答
0

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

于 2013-08-12T11:41:53.077 回答