C++判断端口号占用
时间: 2023-08-04 21:07:07 浏览: 77
在C++中,可以通过以下方式判断端口号是否被占用:
1. 引入头文件:
```c++
#include <winsock2.h>
#include <ws2tcpip.h>
```
2. 创建一个socket:
```c++
SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
```
3. 设置socket选项:
```c++
int optval = 1;
setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char*)&optval, sizeof(optval));
```
这里设置了SO_REUSEADDR选项,表示可以重用本地地址和端口。
4. 绑定socket到指定的IP地址和端口号:
```c++
sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
bind(sock, (sockaddr*)&addr, sizeof(addr));
```
如果端口号已被占用,则bind函数会失败,并返回SOCKET_ERROR。
完整的代码如下:
```c++
#include <winsock2.h>
#include <ws2tcpip.h>
#include <iostream>
#pragma comment(lib, "ws2_32.lib")
int main() {
int port = 8080;
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
std::cerr << "WSAStartup failed\n";
return 1;
}
SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sock == INVALID_SOCKET) {
std::cerr << "socket failed\n";
return 1;
}
int optval = 1;
if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char*)&optval, sizeof(optval)) == SOCKET_ERROR) {
std::cerr << "setsockopt failed\n";
return 1;
}
sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
if (bind(sock, (sockaddr*)&addr, sizeof(addr)) == SOCKET_ERROR) {
std::cerr << "bind failed\n";
return 1;
}
std::cout << "port " << port << " is available\n";
closesocket(sock);
WSACleanup();
return 0;
}
```
如果端口号未被占用,则输出“port 8080 is available”。如果端口号已被占用,则输出“bind failed”。