【问题标题】:Check if TCP port is available (not listening or connected)检查 TCP 端口是否可用(未侦听或连接)
【发布时间】:2012-10-29 14:24:38
【问题描述】:

我使用以下代码检查端口是否可用:

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

谢谢

【问题讨论】:

  • 您将如何使用这些信息?如果要找到合适的端口并打开它,唯一明智的做法是打开端口并在当时对错误做出反应。其他任何东西都有时间问题。

标签: c++ network-programming port netstat


【解决方案1】:

您有两个错误:第一个是在if 语句中您零分配给result。另一个是connect 在连接失败时返回-1,如果连接成功则返回非负值。

还有一个问题是,如果您设法连接,则不会关闭该连接。

【讨论】:

  • 为了防止以后出现这个错误,养成把常量放在第一位的习惯。即if (0 == result)。如果你错误地使用了一个等号,编译器会选择它!
  • 天啊!我忘了一个简单的平等!谢谢
【解决方案2】:

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;
    }
}

【讨论】:

    猜你喜欢
    • 2015-06-07
    • 1970-01-01
    • 1970-01-01
    • 2015-11-05
    • 2012-06-09
    • 2011-01-10
    • 2022-11-11
    • 2013-10-16
    • 1970-01-01
    相关资源
    最近更新 更多