【C++笔记】如何用检查TCP或UDP端口是否被占用

一、检查步骤

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

二、步骤详解

2.1 socket函数

socket 函数是用于创建套接字的函数,其参数和返回值如下:

int socket(int domain, int type, int protocol);
输入参数
  1. domain(地址家族):指定套接字的地址家族,它表示了网络层协议的类型,通常是下列之一:
    1. AF_INET:IPv4 地址家族。
    2. AF_INET6:IPv6 地址家族。
  2. type(套接字类型):指定套接字的类型,它表示了传输层协议的类型,通常是下列之一:
    1. SOCK_STREAM:流套接字,用于 TCP 协议
    2. SOCK_DGRAM:数据报套接字,用于 UDP 协议。
  3. protocol(协议类型):通常设置为0,表示自动选择与套接字类型相匹配的默认协议。在大多数情况下,你不需要指定协议,因为操作系统会根据地址家族和套接字类型自动选择合适的协议。
返回值
  1. 如果 socket 函数成功返回值为socket_fd套接字描述符。
  2. 如果 socket 函数失败,它将返回-1,也就是INVALID_SOCKET。

2.2 配置协议和端口号

sockaddr_in结构体在winsock2.h(windows)或sys/socket.h(linux)头文件下。其结构如下:

// sin为socket in的缩写
struct sockaddr_in {short sin_family;          // 地址家族,通常为 AF_INETunsigned short sin_port;   // 端口号,以网络字节序表示struct in_addr sin_addr;    // IP地址char sin_zero[8];           // 预留字段,通常置零
};

具体配置代码如下:

sockaddr_in serverAddress;
// 将serverAddress内存全部写0
ZeroMemory(&serverAddress,sizeof(serverAddress));
// AF_INET为ipv4,AF_INET6为ipv6
serverAddress.sin_family = AF_INET;
// htons是host to network short的缩写,表示将主机序以short类型转换为的网络序,并以二进制形式存储在sin_port里
serverAddress.sin_port = htons(port);
// INADDR_ANY表示支持任意地址
serverAddress.sin_addr.s_addr = INADDR_ANY;

2.3 bind函数

bind 函数用于将一个套接字与一个本地地址(通常是IP地址和端口号)绑定在一起,以便监听该地址上的连接或接收数据。bind 函数的参数和返回值如下:

int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
输入参数
  1. sockfd:是要绑定的套接字的文件描述符(在Unix/Linux环境中)或套接字句柄(在Windows环境中)。
  2. addr:是一个指向 struct sockaddr 类型的指针,用于指定要绑定的本地地址信息。通常需要将一个sockaddr_in类型的指针转换为sockaddr类型的指针。
  3. addrlen:是 addr 结构的长度,通常可以使用 sizeof 运算符获取。
返回值
  1. 如果 bind 函数成功绑定套接字到指定的地址,它将返回0。
  2. 如果 bind 函数失败,它将返回-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/Linuxif (sock == INVALID_SOCKET) {std::cerr << "Error creating socket" << std::endl;return 1;}// 设置服务器地址信息sockaddr_in serverAddress;// 将serverAddress内存全部写0ZeroMemory(&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/Linuxreturn 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.mzph.cn/news/118587.shtml

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

相关文章

linuxnfs服务安装与配置实践

目录 一.NFS服务 二.NFS和RPC的概念 三.什么是RPC 四.工具 五.安装配置NFS环境 1.查看一下是否有nfs-utils和rpcbind软件包的安装rpm包 2.安装nfs-utils 、rpcbind 3.环境配置 1.nfs配置文件需要遵守如下规则&#xff1a; 2.nfs语法参数解释&#xff1a; 3.nfs客户端…

C#:EXCEL列名、列序号之间互相转换

EXCEL的列名与列序号 之前的关系如下 A1B2C3D4E5F6G7H8I9J10K11L12M13N14O15P16Q17R18S19T20U21V22W23X24Y25Z26AA27AB28 /// <summary>/// 根据给的EXCEL列序号&#xff0c;得出列名字母/// </summary>/// <param name"iColNum">序号</param&…

质数(素数)prime :只能被 1 和 它本身整除的自然数,不可再分,(三种方式求出质数)

从 2 开始&#xff0c;到这个数 减 1 结束为止&#xff0c; 都不能被这个数本身整除。例如&#xff1a;5 是否是质数 &#xff1f; 那么 2&#xff0c;3&#xff0c;4&#xff0c;都不能被 5 整除 所以 5 是 质数判断 n 是否是质数&#xff1f; 2&#xff0c;3&#xff0c;4&…

Android Studio的debug和release模式及签名配置

Android Studio的两种模式及签名配置 使用Android Studio 运行我们的app&#xff0c;无非两种模式&#xff1a;debug和release模式。 https://www.cnblogs.com/details-666/p/keystore.html

el-tree横向纵向滚动条

el-tree未展开时样式 el-tree展开时样式 给容器一个高度&#xff0c;然后样式加上overflow: scroll&#xff0c;这样纵向滚动条就出来了。 <el-card style"height: 528px;overflow: scroll"><el-inputplaceholder"输入关键字进行过滤"v-model&…

嵌入式系统设计师考试笔记之操作系统基础复习笔记一

目录 1、嵌入式软件基础 &#xff08;1&#xff09;嵌入式软件的特点&#xff1a; &#xff08;2&#xff09;嵌入式软件分类&#xff1a; &#xff08;3&#xff09;无操作系统的嵌入式软件的两种实现方式&#xff1a; &#xff08;4&#xff09;有操作系统的三大优点&am…

2021-arXiv-The Power of Scale for Parameter-Efficient Prompt Tuning

2021-arXiv-The Power of Scale for Parameter-Efficient Prompt Tuning Paper: https://arxiv.org/abs/2104.08691 Code: https://github.com/google-research/ text-to-text-transfer-transformer/ blob/main/released_checkpoints.md# lm-adapted-t511lm100k 在这项工作中&…

大数据调度最佳实践 | 从Airflow迁移到Apache DolphinScheduler

迁移背景 有部分用户原来是使用 Airflow 作为调度系统的&#xff0c;但是由于 Airflow 只能通过代码来定义工作流&#xff0c;并且没有对资源、项目的粒度划分&#xff0c;导致在部分需要较强权限控制的场景下不能很好的贴合客户需求&#xff0c;所以部分用户需要将调度系统从…

地面文物古迹保护方案,用科技为文物古迹撑起“智慧伞”

一、行业背景 当前&#xff0c;文物保护单位的安防系统现状存在各种管理弊端&#xff0c;安防系统没有统一的平台&#xff0c;系统功能不足、建设标准不同&#xff0c;产品和技术多样&#xff0c;导致各系统独立&#xff0c;无法联动&#xff0c;形成了“信息孤岛”。地面文物…

安装 fcitx + 搜狗/谷歌输入法 之后导致 四季,重启后黑屏只有鼠标可以移动

一般的原因就是 &#xff1a; fcitx 导致的问题 方法就是 先卸载搜狗&#xff0c;再卸载fcitx 解决办法&#xff1a; 首先&#xff1a;ctrlaltF6 进入命令行界面&#xff0c;如果进不去就 ctrlaltF2 接下来执行&#xff1a; sudo apt-get remove sogoupinyin sudo apt-get …

阿里云服务结构--长期更新

CNCF 全称Cloud Native Computing Foundation&#xff08;云原生计算基金会&#xff09;&#xff0c;成立于 2015 年7月21日&#xff08;于美国波特兰OSCON 2015上宣布&#xff09;&#xff0c;其最初的口号是坚持和整合开源技术来让编排容器作为微服务架构的一部分&#xff0…

webrtc ios build signing

构建命令 $ gn gen out/ios --argstarget_os"ios" target_cpu"arm64" rtc_include_testsfalse --idexcode报错&#xff0c;这个错误是因为存在多个签名的问题&#xff0c;通过错误信息知道其中有一个是无效的&#xff08;被吊销&#xff09;&#xff0c;移…

uni-app中tab选项卡的实现效果 @click=“clickTab(‘sell‘)“事件可传参数

一、效果图 二、代码 <template><view><view class"choose-tab"><view class"choose-tab-item" :class"chooseTab 0 ? active : " data-choose"0" click"clickTab">选项1</view><view …

JVM | 命令行诊断与调优 jhsdb jmap jstat jps

目录 jmap 查看堆使用情况 查看类列表&#xff0c;包含实例数、占用内存大小 生成jvm的堆转储快照dump文件 jstat 查看gc的信息&#xff0c;查看gc的次数&#xff0c;及时间 查看VM内存中三代&#xff08;young/old/perm&#xff09;对象的使用和占用大小 查看元数据空…

Spark【Spark Streaming】

1、基本数据源 1.1、文件流 在spark Shell 下运行&#xff1a; [lyhhadoop102 spark-yarn-3.2.4]$ spark-shell Setting default log level to "WARN". To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel). 2022-09-…

HTML笔记-狂神

1. 初识HTML 什么是HTML&#xff1f; Hyper Text Markup Language : 超文本标记语言 超文本包括&#xff1a;文字、图片、音频、视频、动画等 目前使用的是HTML5&#xff0c;使用 W3C标准 W3C标准包括&#xff1a; 结构化标准语言&#xff08;HTML、XML&#xff09; 表现标…

python自动化测试(一):操作浏览器

通过Python的代码去操作浏览器的操作 目录 目录 1、导入自动化模块 2、定义打开的浏览器驱动、声明一个url变量保存打开的地址 3、使用函数&#xff1a;driver.get(url)打开浏览器的指定页面 4、最大化浏览器窗口&#xff1a;driver.maximize_window() 5、添加全局的等待…

Kafak - 单机/集群快速安装指北(3.x版本)

文章目录 官方下载地址上传安装包解压安装包到指定目录修改解压包名为kafka修改config目录下的配置文件server.propertie配置环境变量其他机器同上 - 修改配置文件中的brokerid启动集群停止Kraft 方式部署集群----(不使用zookeeper) 官方下载地址 http://kafka.apache.org/dow…

redis搭建集群-多实例快速搭建

1.基础的redis.conf的配置 # Redis configuration file example. # # Note that in order to read the configuration file, Redis must be # started with the file path as first argument: # # ./redis-server /path/to/redis.conf# Note on units: when memory size is ne…

【ROS入门】机器人系统仿真——相关组件以及URDF集成Rviz

文章结构 相关组件URDF(Unified Robot Description Format)——创建机器人模型Gazebo——搭建仿真环境Rviz(ROS Visualization Tool)——显示机器人各种传感器感知到的环境信息 URDF集成RvizURDF相关语法robotlinkjoint URDF优化——xacro相关语法属性与算数运算宏文件包含 实操…