Compruebe si el puerto TCP está disponible (no se escucha o conectado)

Yo uso el siguiente código para comprobar si un puerto está disponible o no:

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

El problema es que si el puerto está abierto, pero no está conectado el check failed! ¿Cómo puedo examinar fácilmente que el puerto está disponible (no se escucha, no conectado)?

por ejemplo, el puerto 21111 (salida de netstat) -> mi función no reconocer que el puerto no está libre de

TCP    0.0.0.0:21111          xxxxDUMMYxxxx:0       LISTENING

Thx

  • ¿Cómo va a ser el uso de esta información? Si es para encontrar un puerto adecuado y abrirlo, el único cuerdo manera de hacerlo es abrir el puerto y reaccionar ante los errores en ese momento. Nada más tiene problemas de sincronización.
InformationsquelleAutor leon22 | 2012-11-09

2 Kommentare

  1. 4

    Tiene dos errores: El primero es que en el if declaración que asignar cero a result. La otra es que connect devuelve -1 en error al conectar, y un valor no negativo si logra conectar.

    También hay un problema de que si logran conectarse, no de cerrar la conexión.

    • Para evitar este error en el futuro entrar en el hábito de poner la constante de primera. es decir,if (0 == result). Si usted comete un error de usar un signo igual que el compilador va a recogerlo!
    • OMG! Me olvidé un simple igual! Thx
  2. 1

    la línea client.sin_addr.S_un.S_addr = inet_addr(ipAddressStr); puede no funcionar para mí. cambiar a:

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

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea