Android AdbCommandRejectedException和cannot bind to套接字地址(协议/网络地址/端口)只允许使用一次

本文介绍了一种特殊的ADB端口占用解决方案,包括如何检查端口占用情况、终止占用进程等步骤,适用于Android开发过程中遇到的ADB异常问题。

转载请标明出处:
http://blog.youkuaiyun.com/DJY1992/article/details/72628622
本文出自:【奥特曼超人的博客】



安装apk时,出现错误:

com.Android.ddmlib.AdbCommandRejectedException:device offline
Error while Installing APK

网上百度是有三种方法:

  1. 可以在sdk的文件中找到plattform-tools,到这个文件夹里面去可以找到adb, 双击adb,就可以重新启动了
  2. cmd中,执行两步命令操作: 1、adb kill-server 2、adb start-server
  3. 重启电脑

不过解决无效,这里提供另外一种特殊解法,顺带 了解adb 和 端口占用 的过程。

首先,这里的占用并不是连接的问题,因为androidstudio还可以识别出设备号,只是处于离线或者其它状态,说白点,可以理解为Exception了,这样的话,我们要先结束掉ADB进程和kill掉这个服务,那么当你套接字结束掉的时候,会返回adb无效的错误,如下:

java.net.ConnectException: Connection refused: connect
Error while Installing APK



到这里我们就要运行adb来尝试下是否可以执行,如下图:

奥特曼超人杜锦阳

可以看到提示:

cannot bind to 127.0.0.1:5037: 通常每个套接字地址(协议/网络地址/端口)只允许使用一次。 (10048)



那我们接下来要处理的就是端口问题了, 有的人说我直接重启电脑不就好了?当然也可以,只是我的电脑服务和软件比较多,启动一次很浪费我的时间,这里直接贴处理方案了。

解决步骤分为三大步:

在Terminal窗口或Cmd中输入:

1.查找占用端口

 netstat -aon|findstr 5037

奥特曼超人杜锦阳

2.看端口列表

tasklist /fi "pid eq 7936"

奥特曼超人杜锦阳

3.干掉这个端口占用

taskkill /pid 7936 /f 

奥特曼超人杜锦阳

OK,占用端口没被干掉,我们要找其它办法了,这里我们先用快捷键 《CTRL+ALT+. 》 大法,调出任务管理器,通常情况下,进程下是看不到ID的,这里要查看的话记得选择“查看”-> “选择列” -> “PID” .

一般情况下是这样的,通过PID 找到我们要的 7936 端口,直接右键“结束进程数”+“结束进程” 则可以正常运行了,如果你到这里就解决了,那恭喜你,是正常出现的问题,然而以下碰到的就是非正常的问题。

但是这里发现 7936是adb.exe 强制占用的进程,无法干掉,而 3628 进程又是 AndroidStudio , 我们先关闭 As ,看看是否能干掉它,结果发现还是不行,查找进程发现只剩下adb.exe进程了

奥特曼超人杜锦阳

猜想是底层COM或者实例挂B了。

如果遇到这种百年难得一遇的bug,那还是乖乖重启吧,除非你用WF代码把COM撸一遍。



|| 版权声明:本文为博主杜锦阳原创文章,转载请注明出处。

### 错误分析 `Cannot assign requested address` 是一种常见的绑定错误,通常发生在尝试将套接字绑定到特定 IP 地址端口时。这种错误可能由多种原因引起,包括但不限于: 1. **指定的地址不可用**:如果指定了一个不存在或未配置的本地 IP 地址,则会触发此错误[^2]。 2. **端口冲突**:目标端口已经被其他进程占用或者超出了允许范围[^3]。 3. **TIME_WAIT 状态过多**:大量短时间内的连接可能导致系统资源耗尽,从而引发该问题[^1]。 4. **防火墙或安全组限制**:某些情况下,即使地址有效,也可能因为网络安全策略而被拒绝访问[^5]。 --- ### 解决方案 #### 方法一:确认并修正绑定地址 确保所使用的 `sin_addr.s_addr` 值正确无误。如果是希望监听所有接口上的流量,可以将其设为 `INADDR_ANY`,这表示接受来自任何网络接口的数据包。 ```c bzero(&server_addr, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(39527); server_addr.sin_addr.s_addr = INADDR_ANY; // 使用通配符代替具体IP if (bind(server_socket, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) { perror("Bind failed"); } ``` #### 方法二:调整端口号 检查当前系统的开放端口列表,避免使用已被占用或其他受限的端口。推荐选用动态注册区间的端口号(如 49152 至 65535)。此外,验证端口是否位于操作系统保留范围内。 #### 方法三:优化 TIME_WAIT 处理机制 当存在大量短暂连接时,可能会累积许多处于 `TIME_WAIT` 的状态条目。可以通过修改内核参数来缓解这一现象: 编辑 `/etc/sysctl.conf` 文件加入如下内容: ```bash net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 0 net.ipv4.tcp_fin_timeout = 30 ``` 执行命令使更改生效: ```bash sysctl -p ``` > 注意:部分文档提到启用 `tcp_tw_recycle` 可能带来兼容性隐患,因此建议关闭它[^4]。 #### 方法四:排查防火墙与安全组设置 对于运行于云端环境下的实例而言,务必核实其关联的安全组规则是否允许相应的入站/出站通信流。例如,在阿里云平台下操作需遵循以下步骤: - 登录控制台找到对应 ECS 实例; - 修改相关联的安全组属性以新增自定义 TCP 规则匹配预期的服务端口。 #### 方法五:重启服务或更换主机名/IP映射关系 有时简单的重启能够释放之前锁定的资源;另外也可以考虑临时切换至另一可选地址直至原问题彻底定位清楚为止。 --- ### 示例代码片段 下面给出一段完整的创建并绑定 UDP Socket 的示范程序供参考: ```c #include <stdio.h> #include <string.h> #include <arpa/inet.h> int main() { int sockfd; struct sockaddr_in servaddr; memset(&servaddr, 0, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(8080); if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0){ perror("Socket creation error"); return -1; } if(bind(sockfd , (const struct sockaddr *)&servaddr ,sizeof(servaddr))<0 ){ perror("Bind failed"); close(sockfd ); return -1; } printf("Server started successfully.\n"); while(1){} return 0; } ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值