分析网络端口被谁占用

来自个人维基
2015年5月6日 (三) 20:30Hovercool讨论 | 贡献的版本

(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳转至: 导航搜索

原因是CTS测试FAIL:

-- testNoListeningLoopbackTcpPorts	
fail
	
junit.framework.AssertionFailedError: Found port listening on addr=127.0.0.1, port=5678, UID=0 in /proc/net/tcp 

那现在就要看 5678是被谁占用的:

F:\tmp\a\0423> adb shell cat /proc/net/tcp
  sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode

   0: 0100007F:13AD 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 5500 1 00000000 100 0 0 10 -1

   1: 0100007F:162E 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 9210 1 00000000 100 0 0 10 -1

上面的端口是16进制,5678的十六进制是 162E,即第二个,其inode为 9210

开始找这个inode对应的进程:

F:\tmp\a\0423> adb shell ls -l /proc/*/fd/ | grep 9210
lrwx------ root     system            2014-01-04 10:59 10 -> socket:[9210]

找到了,可是还是没显示出来对应的进程

但从上面可以确定这个文件的fd为10,因此可以用穷举来找到这个进程:

for /l %%i in (1, 1, 2000) do (
    @echo %%i
    adb shell ls -l /proc/%%i/fd/10
)

另存为loop.bat,跑起,后面就可找到对应的进程号,为302:

F:\tmp\android\0423>(

 adb shell ls -l /proc/302/fd/10
)
302
lrwx------ root     system            2014-01-04 10:59 10 -> socket:[9210]