You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中识别对应TCP连接的文件描述符?跨平台方案

跨平台Python获取并关闭TCP连接的解决方案

核心问题解析

在Linux/macOS下,TCP连接对应进程的文件描述符(FD),可以用lsof查看,但os.stat()无法获取网络连接的状态信息;而Windows采用句柄机制,psutil返回的fd字段始终为-1,无法直接用os.close()操作。要实现跨平台方案,需基于psutil结合各平台的系统API处理。


步骤1:用psutil枚举进程TCP连接

psutil的Process.connections()方法是跨平台的,能返回进程所有的网络连接,每个连接是psutil._common.Connection对象,包含以下关键字段:

  • Linux/macOS:fd(有效文件描述符)、laddr/raddr(本地/远程地址)、status(连接状态)
  • Windows:handle(连接句柄)、laddr/raddr、status

步骤2:跨平台关闭TCP连接的实现

直接用psutil结合平台原生API完成关闭,避免依赖os.close()的跨平台差异:

import psutil
import os
import ctypes
from ctypes import wintypes

def close_tcp_connection(conn):
    # 仅处理已建立的连接
    if conn.status != psutil.CONN_ESTABLISHED:
        return False

    if os.name == 'posix':  # Linux/macOS
        if conn.fd != -1:
            try:
                os.close(conn.fd)
                return True
            except OSError as e:
                print(f"关闭FD失败: {e}")
                return False
    elif os.name == 'nt':  # Windows
        handle = conn.handle
        if handle != 0:
            # 调用Windows内核API关闭句柄
            kernel32 = ctypes.WinDLL('kernel32', use_last_error=True)
            kernel32.CloseHandle.argtypes = [wintypes.HANDLE]
            kernel32.CloseHandle.restype = wintypes.BOOL

            success = kernel32.CloseHandle(handle)
            if not success:
                error_code = ctypes.get_last_error()
                print(f"关闭句柄失败,错误码: {error_code}")
                return False
            return True
    return False

# 示例:关闭当前进程中连接到特定IP的TCP连接
if __name__ == "__main__":
    current_proc = psutil.Process()
    target_ip = "192.168.1.100"  # 替换为目标IP

    for conn in current_proc.connections(kind='tcp'):
        if conn.raddr and conn.raddr[0] == target_ip:
            print(f"处理连接: {conn.laddr} -> {conn.raddr}")
            if close_tcp_connection(conn):
                print("关闭成功")
            else:
                print("关闭失败")

关键注意事项

  1. 权限限制:Linux/macOS下需确保进程拥有操作对应FD的权限(一般自身进程无问题);Windows下进程只能操作自己的句柄。
  2. 连接状态判断:建议只关闭ESTABLISHED状态的连接,避免操作监听或关闭中的连接。
  3. psutil版本:确保使用较新版本的psutil(>=5.0.0),避免旧版本在Windows下的handle字段缺失问题。

内容的提问来源于stack exchange,提问作者ullix

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 17:14:57