检查 TCP 端口是否可用(未监听或连接)

3
我使用以下代码来检查端口是否可用:
```python import socket
def is_port_available(port): with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: return s.connect_ex(('localhost', port)) != 0 ```
这个函数将会返回一个布尔值,如果端口可用则为`True`,否则为`False`。
bool ClassA::CheckPortTCP(short int dwPort , char *ipAddressStr)  
{  
    struct sockaddr_in client;         
    int sock;   

    client.sin_family = AF_INET;  
    client.sin_port = htons(dwPort);  
    client.sin_addr.S_un.S_addr = inet_addr(ipAddressStr);      

    sock = (int) socket(AF_INET, SOCK_STREAM, 0);  

    int result = connect(sock, (struct sockaddr *) &client,sizeof(client)); 

    // change to result == 0 -> failure in writing code too quick ;-)
    if (result = 0) return true; // port is active and used
    else return false; 
}  

问题在于,如果端口已经打开但未连接,则检查失败!我该如何轻松地检查端口是否可用(未监听,未连接)?
例如,端口21111(netstat的输出)->我的函数无法识别该端口未空闲。
TCP    0.0.0.0:21111          xxxxDUMMYxxxx:0       LISTENING

Thx


2
你将如何使用这些信息?如果是为了找到一个合适的端口并打开它,唯一明智的方法是在打开端口时立即对错误进行反应。其他任何方式都存在时间问题。 - Damien_The_Unbeliever
2个回答

4
你有两个错误:第一个是在if语句中你将零分配给了result。另一个问题是如果connect连接失败,它将返回-1,否则如果成功连接,将返回非负值。
还有一个问题是,如果你成功连接,没有关闭连接。

3
为了避免这种错误,养成先写常量的习惯。例如:if (0 == result)。如果你犯了只用一个等号的错误,编译器会检测到它! - Ed Heal
哎呀!我忘记了一个简单的等于号!谢谢。 - leon22

1

这一行代码client.sin_addr.S_un.S_addr = inet_addr(ipAddressStr);对我来说无法工作。将其更改为:

bool CheckPortTCP(short int dwPort, char *ipAddressStr)
{
    WSADATA wsaData;
    int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult != NO_ERROR) {
        wprintf(L"WSAStartup function failed with error: %d\n", iResult);
        return false;
    }

    struct sockaddr_in client;
    int sock;
    client.sin_family = AF_INET;
    client.sin_port = htons(dwPort);
    client.sin_addr.s_addr = inet_addr(ipAddressStr);
    sock = (int)socket(AF_INET, SOCK_STREAM, 0);
    if (sock == INVALID_SOCKET) {
        wprintf(L"ERROR: Socket function failed with error: %ld\n", WSAGetLastError());
        WSACleanup();
        return false;
    }

    printf("INFO: Checking Port : %s:%d\n", ipAddressStr, dwPort);
    int result = connect(sock, (struct sockaddr *) &client, sizeof(client));
    if (result == SOCKET_ERROR) {
        printf("ERROR: %s", WSAGetLastError());
        WSACleanup();
        return false;
    }
    else 
    {
        WSACleanup();
        closesocket(sock);
        return true;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接