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

news2024/11/17 21:38:18

一、检查步骤

  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.coloradmin.cn/o/1138830.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

eslint提示 xxx should be listed in the project's dependencies

有时候手动安装了一个npm包A&#xff0c;npm包A里面包含了npm包B&#xff0c;这时候如果 import xxx from npm包B;eslint会报错&#xff0c;提示 npm包B 不在 package.json 里面 解决方法&#xff1a;在 eslintrc.js 增加配置 module.exports {rules: {import/no-extraneous-d…

Linux常见问题解决操作(yum被占用、lsb无此命令、Linux开机进入命令界面等)

Linux常见问题解决操作&#xff08;yum被占用、lsb无此命令、Linux开机进入命令界面等&#xff09; 问题一、新安装的Linux使用命令lsb_release提示无此命令&#xff0c;需先安装再使用 Linux安装lsb命令 lsb是Linux Standard Base的缩写&#xff08;Linux基本标准&#xff…

springboot的缓存和redis缓存,入门级别教程

一、springboot&#xff08;如果没有配置&#xff09;默认使用的是jvm缓存 1、Spring框架支持向应用程序透明地添加缓存。抽象的核心是将缓存应用于方法&#xff0c;从而根据缓存中可用的信息减少执行次数。缓存逻辑是透明地应用的&#xff0c;对调用者没有任何干扰。只要使用…

cocosCreator 之localStorage本地存储和封装拓展

版本&#xff1a; 3.8.0 语言&#xff1a; TypeScript 环境&#xff1a; Mac 简介 在cocosCreator中&#xff0c;针对于本地存储主要使用localStorage接口&#xff0c;通过key-value的格式进行存储和读取数据。 主要接口有&#xff1a; 接口描述setItem(key, value)保存指定…

Spring Security —漏洞防护—跨站请求伪造(CSRF)

在终端用户可以 登录 的应用程序中&#xff0c;必须考虑如何防止 跨站请求伪造&#xff08;CSRF&#xff09;。 Spring Security 默认为 不安全的HTTP方法&#xff08;如POST请求&#xff09;提供CSRF攻击防护&#xff0c;因此无需额外代码。你可以使用下面的方法明确指定默认…

今年天猫双11,打响电商AI时代第一枪

自阿里提出双11以来&#xff0c;今年已是第15个年头。在这15年间&#xff0c;双11见证了中国电商的发展轨迹&#xff0c;从野蛮生长、完善体验到重质重效。如今&#xff0c;在双11的见证下&#xff0c;中国电商的进化正悄然发生。 一些新的变化值得关注。“最值得买的电视”&a…

系列六、FactoryBean vs ApplicationContext

一、FactoryBean vs ApplicationContext 1.1、概述 BeanFactory是一个工厂类&#xff0c;负责生产和管理bean&#xff0c;在Spring中BeanFactory是IOC容器的核心接口&#xff0c;它的主要职责就是生产bean及建立各个bean之间的依赖。applicationContext是BeanFactory的一个子接…

Go 的连接池、重试和超时

这是一个来自 API 的间歇性 500 个内部服务器错误的故事&#xff0c;这些错误最终是由 Go 包中的硬编码常量引起的database/sql。我将主要为您省去冗长的故事&#xff0c;并直接讨论问题以及我们发现的原因。我们注意到来自特定 API 端点的 500 错误数量有所增加&#xff0c;并…

网络协议--BOOTP:引导程序协议

16.1 引言 在第5章我们介绍了一个无盘系统&#xff0c;它在不知道自身IP地址的情况下&#xff0c;在进行系统引导时能够通过RARP来获取它的IP地址。然而使用RARP有两个问题&#xff1a;&#xff08;1&#xff09;IP地址是返回的唯一结果&#xff1b;&#xff08;2&#xff09;…

目前最优的非蒸馏、可商用的开源大模型!MIT-IBM 提出鲑鱼模型!

作者 | 谢年年、ZenMoore 今年上半年&#xff0c;IBM 加入大模型战局&#xff0c;提出了一种使用原则(Principle)驱动的、基于 LLM Self-Instruct 的全新方法&#xff1a;SELF-ALIGN &#xff08;自对齐&#xff09;&#xff0c;并以开源LLaMA为基础&#xff0c;用不到300行&am…

el-table(vue2中)滚动条被固定列盖住

一、项目场景&#xff1a; vue2 el-table 二、问题描述 1、现场图片&#xff1a; 2、全局css环境配置了滚动条高度为6px /* 全局滚动条配置 */ ::-webkit-scrollbar {width: 6px;height: 6px; }::-webkit-scrollbar-track {background-color: #f1f1f1; }::-webkit-scrollbar-…

机器学习2(Numpy)

1、numpy ndarray 案例演示 可以在创建的时候就指定元素类型 生成0/1数组 从现有数组中生成 生成固定数组 生成随机数组

软考系统架构之案例篇(架构设计相关概念)

案例篇-架构设计相关概念 1. 架构风格的概念2. 五大架构风格有哪些3. MVC架构含义4. 云计算架构5. 云原生架构设计原则6. ESB的主要功能包括7. 质量属性的含义及其设计策略8. EJB中的 Bean 分三种类型9. 风险点、敏感点、权衡点的含义10. REST 的5个原则 1. 架构风格的概念 软…

GO 语言的函数

函数是什么&#xff1f; 学过编程的 xdm 对于函数自然不会陌生&#xff0c;那么函数是什么呢&#xff1f; 函数是一段可以重用的代码块&#xff0c;可以被多次调用&#xff0c;我们可以通过使用函数&#xff0c;提高咱们代码代码的模块化&#xff0c;提高程序的可读性和可维护性…

vite vue3 ts 全局封装自定义svg组件,全局引入

1.安装vite-plugin-svg-icons插件 yarn add vite-plugin-svg-icons -D 2.配置vite.config.ts文件&#xff0c;配置插件 import path from path import { createSvgIconsPlugin } from vite-plugin-svg-iconsplugins: [vue(),// 配置svg createSvgIconsPlugin({// 指定需要缓…

如何在Microsoft Visual Studio 中使用Cpp代码调用python代码

Microsoft Visual Studio中Cpp调用Python代码 本文介绍如何在Microsoft Visual Studio中&#xff0c;开发cpp项目时&#xff0c;调用python代码。 文章目录 Microsoft Visual Studio中Cpp调用Python代码前言一、Cpp生成exe文件1.1 安装python环境1.2 配置Microsoft Visual Stu…

vue ant DatePicker 日期选择器 限制日期可控范围

场景 限制当前日期之前不能选择 限制只能选择日期区间内 Ant Design Vue 效果 <a-date-picker :disabledDate"disabledDate"></a-date-picker>method // 限制日期选择disabledDate(current) {return current && current > moment().endOf(&…

JSON parse error: Cannot deserialize instance of `xxx` out of START_ARRAY token

报错原因 前端传参类型是数组&#xff0c;后端接收参数类型是字符串。 解决办法 前端传参类型改为字符串即可。 如下图 【修改前】 【修改后】

【Linux】安装与配置虚拟机及虚拟机服务器坏境配置与连接

目录 操作系统介绍 什么是操作系统 常见操作系统 UNIX操作系统 linux操作系统 mac操作系统 嵌入式操作系统 个人版本和服务器版本的区别 安装VMWare虚拟机 VMWare虚拟网卡 ​编辑 配置虚拟网络编辑器 ​编辑 安装配置Windows Server 2012 R2 安装Windows Server 2…

如何解决电脑中缺失kernel32.dll文件的问题,四种常见的解决方法

在使用电脑过程中&#xff0c;有时我们可能会遇到一些错误提示&#xff0c;例如“找不到或缺少kernel32.dll文件”。遇到这种情况下&#xff0c;我们可以采取哪些措施来解决这个问题呢&#xff1f;本文将介绍关于kernel32.dll文件的作用&#xff0c;并提供四种常见的解决方法。…