当前位置: 首页 > article >正文

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

一、检查步骤

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

二、CODE

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

#include <iostream>
#include <winsock2.h> // Windows套接字编程头文件
// #include <sys/socket.h> // Unix/Linux套接字编程头文件
#include <Windows.h>

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. 使用以下命令行编译cpp代码,其中checkPort.cpp为源文件,checkPort为输出可执行文件,-lws2_32用于链接Windows的Winsock2库。
    g++ .\checkPort.cpp -o checkPort -lws2_32
  2. 以下命令行运行可执行文件
    .\checkPort.exe
  3. 如果端口未被占用,则会输出以下内容。
    在这里插入图片描述
  4. 如果端口已被占用,则会输出以下内容。
    在这里插入图片描述
  5. 如果windows下输出以下内容,一般来说是因为WSAStartup没有配置。
    在这里插入图片描述

http://www.kler.cn/a/106316.html

相关文章:

  • 魔方和群论
  • 基于STM32的智能温室控制系统设计
  • c# 调用c++ 的dll 出现找不到函数入口点
  • 2024-11-16 串的存储结构
  • 31.3 XOR压缩和相关的prometheus源码解读
  • STM32设计防丢防摔智能行李箱
  • 网工内推 | 急招网工,思科、华为认证优先,法定节假日三薪
  • mysql GRANT创建用户授权
  • 2023 年 的 DBA 有哪些变化?
  • zk-Bench:SNARKs性能对比评估工具
  • 【Linux】Linux+Nginx部署项目
  • Django viewsets 视图集与 router 路由实现评论接口开发
  • 大数据Flink(一百零四):SQL任务参数配置
  • 【ARM AMBA Q_Channel 详细介绍】
  • react-组件间的通讯
  • tftp服务的搭建
  • 京东(天猫)数据分析:2023下半年茶饮料市场高速增长,东方树叶一骑绝尘
  • pytorch 入门 (四)案例二:人脸表情识别-VGG16实现
  • 为什么虚拟dom会提高性能?
  • LSTM 与 GRU
  • 十九、类型信息(1)
  • 贪心区间类题目
  • 如何使用手机蓝牙设备作为电脑的解锁工具像动态锁那样,蓝牙接近了电脑,电脑自动解锁无需输入开机密码
  • 【MATLAB源码-第56期】基于WOA白鲸优化算法和PSO粒子群优化算法的三维路径规划对比。
  • 竞赛 深度学习人脸表情识别算法 - opencv python 机器视觉
  • springboot的缓存和redis缓存,入门级别教程