一、检查步骤
- 使用socket函数创建socket_fd套接字。
- 使用sockaddr_in结构体配置协议和端口号。
- 使用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;
}
三、运行结果
- 使用以下命令行编译cpp代码,其中checkPort.cpp为源文件,checkPort为输出可执行文件,-lws2_32用于链接Windows的Winsock2库。
g++ .\checkPort.cpp -o checkPort -lws2_32
- 以下命令行运行可执行文件
.\checkPort.exe
- 如果端口未被占用,则会输出以下内容。
- 如果端口已被占用,则会输出以下内容。
- 如果windows下输出以下内容,一般来说是因为WSAStartup没有配置。