簡體   English   中英

在Python中查詢TCP套接字連接狀態

[英]Query TCP socket connection state in 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中讀取此連接狀態,CONNECTED,CLOSE_WAIT ...... 通過套接字文檔閱讀沒有給我任何暗示。

這僅適用於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)

你要找的是打印元組中的第一項(整數)。 您可以使用tcp_info定義交叉檢查結果。

注意:tcp_info的大小應該是104,但我使用92,不知道發生了什么,但它對我有用。

如果Google將其他任何人帶到這里,我只是將這個問題的一半解決方案用於管道。

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

一旦識別出該套接字,該怎么做仍然是TBD。

在Linux上,您可以使用getsockopt(2)TCP_INFO選項來了解連接的狀態。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM