• 【软件教程】如何用C++检查TCP或UDP端口是否被占用


    一、检查步骤

    1. 使用socket函数创建socket_fd套接字。
    2. 使用sockaddr_in结构体配置协议和端口号。
    3. 使用bind函数尝试与端口进行绑定,成功返回0表示未被占用,失败返回-1表示已被占用。

    二、CODE

    其中port需要修改为想要检测的端口号,也可以将代码改写为根据argv参数检测。

    #include 
    #include  // Windows套接字编程头文件
    // #include  // Unix/Linux套接字编程头文件
    #include 
    
    int main() {
        // WSAStartup用于初始化 Winsock 库,它在进行套接字编程之前需要调用。
        // MAKEWORD(2,2)表示请求2.2版本
        // wsaData用于接收WinSock初始化的信息
        WSADATA wsaData;
        int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
        if (iResult != NO_ERROR) {
            wprintf(L"WSAStartup failed with error: %ld\n", iResult);
            return 1;
        }
    	// 上面代码只有windows需要加,linux不需要
    
    
        int port = 80; // 要检查的端口号
    
        // 创建套接字
        SOCKET sock = socket(AF_INET, SOCK_STREAM, 0); // For Windows
        // int sock = socket(AF_INET, SOCK_STREAM, 0); // For Unix/Linux
        
        if (sock == INVALID_SOCKET) {
            std::cerr << "Error creating socket" << std::endl;
            return 1;
        }
    	
        // 设置服务器地址信息
        sockaddr_in serverAddress;
        // 将serverAddress内存全部写0
        ZeroMemory(&serverAddress,sizeof(serverAddress));
        serverAddress.sin_family = AF_INET;
        serverAddress.sin_port = htons(port);
        serverAddress.sin_addr.s_addr = INADDR_ANY;
    
        // 尝试绑定套接字到指定端口
        int result = bind(sock, (struct sockaddr*)&serverAddress, sizeof(serverAddress));
    
        if (result == 0) {
            std::cout << "Port " << port << " is available" << std::endl;
        } else {
            std::cerr << "Port " << port << " is already in use" << std::endl;
        }
    
        // 关闭套接字
        closesocket(sock); // For Windows
        // close(sock); // For Unix/Linux
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52

    三、运行结果

    1. 使用以下命令行编译cpp代码,其中checkPort.cpp为源文件,checkPort为输出可执行文件,-lws2_32用于链接Windows的Winsock2库。
      g++ .\checkPort.cpp -o checkPort -lws2_32
    2. 以下命令行运行可执行文件
      .\checkPort.exe
    3. 如果端口未被占用,则会输出以下内容。
      在这里插入图片描述
    4. 如果端口已被占用,则会输出以下内容。
      在这里插入图片描述
    5. 如果windows下输出以下内容,一般来说是因为WSAStartup没有配置。
      在这里插入图片描述
  • 相关阅读:
    Linux TCP和UDP协议
    14天阅读挑战赛(趣学算法)笔记1
    【Leecode】代码随想录栈和队列篇day12(应用)
    Varnish讲解文章、缓存代理配置、核心功能、优势、Varnish在什么情况下会选择缓存哪些类型的内容、Varnish如何实现负载均衡功能?
    web前端 -- 笔记
    低代码开发平台助力生产管理:采购成本管理的优化
    mysql 主从同步恢复处理
    Java代码审计之ofcms
    Java设计模式-建造者模式(Builder)
    XSS攻击理解与预防
  • 原文地址:https://blog.csdn.net/zhangjiuding/article/details/134047167