获取被占用的端口号(C++)

#include <algorithm>
#include "iphlpapi.h"
#pragma comment(lib, "Iphlpapi.lib")


vector<unsigned short> GetAllUsedTcpPort()
{
    std::vector<unsigned short> result;

    ULONG size = 0;
    GetTcpTable(NULL, &size, TRUE);

    char *pBuffer = new char[size];
    PMIB_TCPTABLE tcpTable = reinterpret_cast<PMIB_TCPTABLE>(pBuffer);

    if (GetTcpTable(tcpTable, &size, FALSE) == NO_ERROR)
    {
        for (size_t i = 0; i < tcpTable->dwNumEntries; i++)
        {
            result.push_back(ntohs((unsigned short)tcpTable->table[i].dwLocalPort));
        }
    }
    delete pBuffer;
    pBuffer = nullptr;

    return result;
}

vector<unsigned short> GetAllUsedUdpPort()
{
    std::vector<unsigned short> result;

    ULONG size = 0;
    GetUdpTable(NULL, &size, TRUE);

    char *pBuffer = new char[size];
    PMIB_UDPTABLE updTable = reinterpret_cast<PMIB_UDPTABLE>(pBuffer);

    if (GetUdpTable(updTable, &size, FALSE) == NO_ERROR)
    {
        for (size_t i = 0; i < updTable->dwNumEntries; i++)
        {
            result.push_back(ntohs((unsigned short)updTable->table[i].dwLocalPort));
        }
    }

    delete pBuffer;
    pBuffer = nullptr;

    return result;
}
 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Windows API中,可以使用`GetTcpTable()`函数和`GetUdpTable()`函数来获取当前系统中正在使用的TCP和UDP端口信息。通过遍历这些信息,可以判断指定的端口是否被占用。 以下是使用`GetTcpTable()`函数和`GetUdpTable()`函数判断指定端口是否被占用的示例代码: ```c++ #include <winsock2.h> #include <iphlpapi.h> #include <stdio.h> #pragma comment(lib, "iphlpapi.lib") #pragma comment(lib, "ws2_32.lib") bool IsPortInUse(USHORT port, bool isTCP) { PMIB_TCPTABLE pTcpTable; PMIB_UDPTABLE pUdpTable; DWORD dwSize = 0; DWORD dwRetVal = 0; bool bInUse = false; if (isTCP) { pTcpTable = (PMIB_TCPTABLE)malloc(sizeof(MIB_TCPTABLE)); if (pTcpTable == NULL) { printf("Error allocating memory\n"); return false; } dwSize = sizeof(MIB_TCPTABLE); dwRetVal = GetTcpTable(pTcpTable, &dwSize, TRUE); if (dwRetVal == ERROR_INSUFFICIENT_BUFFER) { free(pTcpTable); pTcpTable = (PMIB_TCPTABLE)malloc(dwSize); if (pTcpTable == NULL) { printf("Error allocating memory\n"); return false; } dwRetVal = GetTcpTable(pTcpTable, &dwSize, TRUE); } if (dwRetVal != NO_ERROR) { printf("GetTcpTable failed with error %d\n", dwRetVal); free(pTcpTable); return false; } for (DWORD i = 0; i < pTcpTable->dwNumEntries; i++) { if (pTcpTable->table[i].dwLocalPort == htons(port)) { bInUse = true; break; } } free(pTcpTable); } else { pUdpTable = (PMIB_UDPTABLE)malloc(sizeof(MIB_UDPTABLE)); if (pUdpTable == NULL) { printf("Error allocating memory\n"); return false; } dwSize = sizeof(MIB_UDPTABLE); dwRetVal = GetUdpTable(pUdpTable, &dwSize, TRUE); if (dwRetVal == ERROR_INSUFFICIENT_BUFFER) { free(pUdpTable); pUdpTable = (PMIB_UDPTABLE)malloc(dwSize); if (pUdpTable == NULL) { printf("Error allocating memory\n"); return false; } dwRetVal = GetUdpTable(pUdpTable, &dwSize, TRUE); } if (dwRetVal != NO_ERROR) { printf("GetUdpTable failed with error %d\n", dwRetVal); free(pUdpTable); return false; } for (DWORD i = 0; i < pUdpTable->dwNumEntries; i++) { if (pUdpTable->table[i].dwLocalPort == htons(port)) { bInUse = true; break; } } free(pUdpTable); } return bInUse; } int main() { USHORT port = 80; bool isTCP = true; if (IsPortInUse(port, isTCP)) { printf("Port %d is in use\n", port); } else { printf("Port %d is not in use\n", port); } return 0; } ``` 在上面的示例代码中,`IsPortInUse()`函数用于判断指定的端口是否被占用,其中`port`参数为指定的端口号,`isTCP`参数表示是否为TCP端口。如果端口占用,该函数返回`true`,否则返回`false`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值