[英]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.