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
