openharmony北向开发问题之HDC端口8710被svchost占用问题

HDC 端口 8710 被 svchost.exe 占用问题排查记录

环境

  • 系统:Windows 11 专业版 (Build 26200),从 Win10 升级而来
  • HDC 路径E:\KH\开发工具包\hdc\hdc.exe

问题

开机后 hdc list targets 无法识别设备,端口 8710 被 svchost.exe 占用。杀掉后恢复,重启复现。

根因

Win11 将 TCP 动态端口范围从 Win10 的 49152-65535 调低为 1024-15001 ,导致 8710 落入动态分配范围。Windows 的 IP Helper 服务(iphlpsvc 开机自启时从该范围随机分配到 8710,抢占了 HDC 端口。

定位命令:

powershell 复制代码
wmic process where ProcessId=<占用PID> get CommandLine /format:list
# 结果:svchost.exe -k NetSvcs -p -s iphlpsvc

解决方案

1. 调整动态端口范围(起始值从1024改为10000)

powershell 复制代码
netsh int ipv4 set dynamic tcp start=10000 num=55536
netsh int ipv4 set dynamic udp start=10000 num=55536

2. 禁用 IP Helper 服务

powershell 复制代码
sc config iphlpsvc start= disabled

不使用 IPv6 隧道/Teredo 则无影响。恢复:sc config iphlpsvc start= auto

3. HDC 端口环境变量提升为系统级

系统中存在用户级 HDC_SERVER_PORT=7035,DevEco Studio 读不到,其内置 HDC 仍用默认 8710。

powershell 复制代码
setx HDC_SERVER_PORT 7035 /M

自动化脚本

把这个脚本保存为本地bat,直接执行会自动拉起hdc服务,前提是你的系统环境变量配置了hdc

复制代码
@echo off
setlocal enabledelayedexpansion
chcp 65001 >nul 2>&1

set "L1========================================="
set "L2= HDC 设备识别自动排查与修复脚本"
set "L3= 当 hdc list targets 无法识别设备时"
set "L4= 自动排查服务和端口问题并尝试修复"
set "L5========================================="

echo !L1!
echo !L2!
echo !L3!
echo !L4!
echo !L5!

set PORT=8710
set MAX_RETRY=3

:: Step 0: 检查 hdc 命令是否可用
echo.
set "M0=[!time:~0,8!] 检查 hdc 命令是否可用"
echo !M0!
where hdc >nul 2>&1
if errorlevel 1 (
    set "M1=  [FAIL] hdc 命令未找到"
    set "M2=  请将 hdc.exe 所在目录添加到系统 PATH 环境变量中"
    echo !M1!
    echo !M2!
    pause
    exit /b 1
) else (
    for /f "tokens=*" %%p in ('where hdc') do (
        set "M3=  [OK] hdc 路径: %%p"
        echo !M3!
    )
)

:: 检查设备
set FOUND=0
for /f "tokens=*" %%a in ('hdc list targets 2^>^&1 ^| findstr /v /c:"connect failed"') do (
    set "LINE=%%a"
    if not "!LINE!"=="" if not "!LINE!"=="[Empty]" (
        set FOUND=1
        echo   %%a
    )
)

if !FOUND!==1 (
    set "M4=  [OK] 设备已连接"
    echo !M4!
    pause
    goto :eof
)

set "M5=  [WARN] 未识别到设备,开始排查..."
echo !M5!

:: Step 1: 检查端口占用
echo.
set "M6=[!time:~0,8!] 检查端口 %PORT% 占用情况"
echo !M6!
set CONFLICT=0
for /f "tokens=5" %%a in ('netstat -ano ^| findstr /r /c:":%PORT% .*LISTENING"') do (
    set PID=%%a
    if not "!PID!"=="0" (
        for /f "tokens=1" %%n in ('tasklist /FI "PID eq !PID!" /NH 2^>nul') do (
            set PNAME=%%n
            if /i not "!PNAME!"=="hdc.exe" (
                set "M7=  [WARN] 端口被 !PNAME! ^(PID: !PID!^) 占用"
                echo !M7!
                set CONFLICT=1
                taskkill /F /PID !PID! >nul 2>&1
                set "M8=  [OK] 已结束占用进程"
                echo !M8!
            )
        )
    )
)
if !CONFLICT!==0 (
    set "M9=  [OK] 端口 %PORT% 未被其他程序占用"
    echo !M9!
)

:: Step 2: 重启 HDC Server 进程
echo.
set "M10=[!time:~0,8!] 重启 HDC Server 进程"
echo !M10!
set SERVER_OK=0

tasklist /FI "IMAGENAME eq hdc.exe" 2>nul | find /I "hdc.exe" >nul
if not errorlevel 1 (
    set "M11=  [INFO] 发现已有的 hdc 进程,正在结束..."
    echo !M11!
    taskkill /F /IM hdc.exe >nul 2>&1
    timeout /t 1 /nobreak >nul
)

set "M12=  [INFO] 启动 hdc server..."
echo !M12!
hdc start >nul 2>&1
timeout /t 2 /nobreak >nul

tasklist /FI "IMAGENAME eq hdc.exe" 2>nul | find /I "hdc.exe" >nul
if not errorlevel 1 (
    set "M13=  [OK] HDC Server 启动成功"
    echo !M13!
    set SERVER_OK=1
) else (
    set "M14=  [FAIL] HDC Server 启动失败"
    echo !M14!
    pause
    exit /b 1
)

:: Step 3: 重新检查设备
set RETRY=1
:retry_loop
if !RETRY! gtr %MAX_RETRY% goto :retry_done
echo.
set "M15=[!time:~0,8!] 第 !RETRY!/%MAX_RETRY% 次尝试识别设备..."
echo !M15!
timeout /t 2 /nobreak >nul

set FOUND=0
for /f "tokens=*" %%a in ('hdc list targets 2^>^&1 ^| findstr /v /c:"connect failed"') do (
    set "LINE=%%a"
    if not "!LINE!"=="" if not "!LINE!"=="[Empty]" (
        set FOUND=1
        echo   %%a
    )
)

if !FOUND!==1 (
    set "M16=  [OK] 设备已连接"
    echo !M16!
    pause
    goto :eof
)
set /a RETRY+=1
goto :retry_loop
:retry_done

:: Step 4: 检查驱动状态
echo.
set "M17=[!time:~0,8!] 检查 USB 驱动状态"
echo !M17!
pnputil /enum-devices /connected | findstr /i "HDC" >nul
if not errorlevel 1 (
    set "M18=  [OK] 发现 HDC 相关 USB 设备"
    echo !M18!
) else (
    set "M19=  [WARN] 未发现 HDC 相关 USB 设备,请检查驱动或连接"
    echo !M19!
)

echo.
echo !L1!
set "M20=  排查结束: HDC Server 运行正常但仍未发现设备"
set "M21=  请尝试以下操作:"
set "M22=    1. 重新插拔 USB 数据线"
set "M23=    2. 更换数据线或 USB 接口"
set "M24=    3. 检查设备端是否开启调试权限"
echo !M20!
echo !M21!
echo !M22!
echo !M23!
echo !M24!
echo !L1!
pause
exit /b 1
相关推荐
AI2中文网1 小时前
App Inventor 2 鸿蒙先行版开发进展:从 Android 到 HarmonyOS 的积木编程迁移实录
android·低代码·华为·harmonyos·app inventor
nashane1 小时前
HarmonyOS 6学习:DevEco Studio跨平台开发环境深度排障指南
学习·华为·harmonyos
不爱吃糖的程序媛2 小时前
使用 hionic 将 Web 应用部署到鸿蒙PC平台
flutter·华为·harmonyos
慧海灵舟2 小时前
鸿蒙零基础实战教程Day0:HarmonyOS NEXT 项目创建与环境准备
华为·harmonyos
G_dou_2 小时前
Flutter三方库适配OpenHarmony【age_calculator】年龄计算器项目完整实战
flutter·harmonyos
慧海灵舟2 小时前
阿里 AGenUI 开源库前后端实战教程 —— Day 6:鸿蒙端 Playground 官方示例项目解析
华为·开源·harmonyos·写文章,赢小鸿ai
慧海灵舟2 小时前
鸿蒙零基础实战教程Day1:HarmonyOS ArkUI 入门实战
华为·harmonyos
痕忆丶2 小时前
openharmony北向开发基础之访问公共文件目录
harmonyos
特立独行的猫a2 小时前
OHOS (OpenHarmony) 鸿蒙的Rust 交叉编译环境搭建指南
华为·rust·harmonyos·鸿蒙pc