当前位置:首页 > 编程笔记 > 正文
已解决

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

来自网友在路上 169869提问 提问时间:2023-10-27 21:55:42阅读次数: 69

最佳答案 问答题库698位专家为你答疑解惑

一、检查步骤

  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/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没有配置。
    在这里插入图片描述
查看全文

99%的人还看了

猜你感兴趣

版权申明

本文"【软件教程】如何用C++检查TCP或UDP端口是否被占用":http://eshow365.cn/6-26342-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!