C++ 扫描局域网某个端口是否开放(如 5555 )(android adb) 线程并发加速
当然可以,C++ 扫描 IP 的同时判断端口是否开放(比如 5555) 是完全可行的。你可以通过 TCP 套接字连接测试 来实现端口探测,这比 ICMP Ping 更精准,也能用于 ADB 连接前判断设备是否可达。
✅ 用 C++ 扫描局域网某个端口是否开放(如 5555)
以下是一个完整示例,使用 WinSock 在 Windows 上测试每个 IP 的端口是否可连接:
✅ 示例代码(TCP 端口扫描 5555)
#include #include #include #include #pragma comment(lib, \"ws2_32.lib\")bool isPortOpen(const std::string& ip, int port, int timeout_ms = 100) { SOCKET sock; sockaddr_in addr; WSADATA wsaData; WSAStartup(MAKEWORD(2, 2), &wsaData); sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (sock == INVALID_SOCKET) return false; u_long mode = 1; // 非阻塞模式 ioctlsocket(sock, FIONBIO, &mode); addr.sin_family = AF_INET; addr.sin_port = htons(port); inet_pton(AF_INET, ip.c_str(), &addr.sin_addr); connect(sock, (sockaddr*)&addr, sizeof(addr)); fd_set writeSet; FD_ZERO(&writeSet); FD_SET(sock, &writeSet); timeval timeout; timeout.tv_sec = 0; timeout.tv_usec = timeout_ms * 1000; int result = select(0, NULL, &writeSet, NULL, &timeout); closesocket(sock); WSACleanup(); return result > 0;}int main() { std::string base_ip = \"192.168.1.\"; for (int i = 1; i <= 254; ++i) { std::string ip = base_ip + std::to_string(i); if (isPortOpen(ip, 5555)) { std::cout << \"[ADB FOUND] \" << ip << \":5555 is OPEN!\" << std::endl; std::string cmd = \"adb connect \" + ip + \":5555\"; system(cmd.c_str()); } else { std::cout << \"[ ] \" << ip << \":5555 closed\" << std::endl; } } return 0;}
✅ 输出示例:
[ ] 192.168.1.1:5555 closed[ADB FOUND] 192.168.1.123:5555 is OPEN!...
✅ 编译说明:
- Windows 平台,使用 Visual Studio 或 g++(MinGW)
- 需要链接
ws2_32.lib
- 如果你用命令行编译,可以使用:
g++ scan_adb.cpp -o scan_adb.exe -lws2_32
✅ 高级优化(可选):
✅ 总结:
需要我帮你:
- 把这段代码封装成 GUI 小工具?
- 加上线程并发加速?
- 加上 JSON 日志输出?
你可以告诉我,我可以一步步帮你构建成专业扫描器。
并行快速
好!我们现在来升级你这个 C++ 扫描器:
🎯 目标:
扫描整个局域网段(如 192.168.1.1~254),并发线程检测每个 IP 的
5555
端口是否开放,如果开放,自动执行adb connect
命令。
✅ 技术实现要点:
- 使用
std::thread
并发处理多个 IP 扫描 - 控制线程数量避免资源耗尽(线程池风格)
- TCP socket 检测端口是否开放(非阻塞 + select)
✅ 完整示例代码:支持多线程扫描 5555 端口
#include #include #include #include #include #include #include #pragma comment(lib, \"ws2_32.lib\")std::mutex print_mutex;bool isPortOpen(const std::string& ip, int port, int timeout_ms = 100) { SOCKET sock; sockaddr_in addr; WSADATA wsaData; WSAStartup(MAKEWORD(2, 2), &wsaData); sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (sock == INVALID_SOCKET) return false; u_long mode = 1; // 非阻塞 ioctlsocket(sock, FIONBIO, &mode); addr.sin_family = AF_INET; addr.sin_port = htons(port); inet_pton(AF_INET, ip.c_str(), &addr.sin_addr); connect(sock, (sockaddr*)&addr, sizeof(addr)); fd_set writeSet; FD_ZERO(&writeSet); FD_SET(sock, &writeSet); timeval timeout; timeout.tv_sec = 0; timeout.tv_usec = timeout_ms * 1000; int result = select(0, NULL, &writeSet, NULL, &timeout); closesocket(sock); WSACleanup(); return result > 0;}void scanIP(const std::string& ip, int port) { if (isPortOpen(ip, port)) { std::lock_guard<std::mutex> lock(print_mutex); std::cout << \"[ADB FOUND] \" << ip << \":\" << port << \" is OPEN!\" << std::endl; std::string cmd = \"adb connect \" + ip + \":\" + std::to_string(port); system(cmd.c_str()); } else { std::lock_guard<std::mutex> lock(print_mutex); std::cout << \"[ ] \" << ip << \":\" << port << \" closed.\" << std::endl; }}int main() { const std::string base_ip = \"192.168.1.\"; const int port = 5555; const int max_threads = 50; // 同时并发的最大线程数 std::vector<std::thread> threads; for (int i = 1; i <= 254; ++i) { std::string ip = base_ip + std::to_string(i); threads.emplace_back(scanIP, ip, port); // 控制线程数量(简单线程池) if (threads.size() >= max_threads) { for (auto& t : threads) t.join(); threads.clear(); } } // 等待所有线程结束 for (auto& t : threads) { if (t.joinable()) t.join(); } std::cout << \"\\n✅ 扫描完成。\" << std::endl; return 0;}
✅ 编译说明(Windows):
用 g++
(MinGW)编译:
g++ adb_scanner.cpp -o adb_scanner.exe -lws2_32 -std=c++11
或者用 Visual Studio 新建 C++ 项目,将代码复制进去即可。
✅ 输出示例:
[ ] 192.168.1.1:5555 closed.[ADB FOUND] 192.168.1.103:5555 is OPEN![ ] 192.168.1.10:5555 closed....✅ 扫描完成。
✅ 可扩展方向(如果你需要我帮忙实现):
- IP 段参数化(支持从命令行输入
192.168.0.0/24
) - 扫描多个端口(如 5555, 80, 22)
- 多线程带进度条
- JSON/CSV 输出结果
- GUI 工具版(用 Qt 或 Win32)
需要我做这些扩展其中哪一个?或者打包成 EXE 给你直接用?