Проверьте, доступен ли порт TCP (не прослушивается или не подключен)

Я использую следующий код, чтобы проверить, доступен порт или нет:

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

Спасибо

3

Решение

У вас есть две ошибки: во-первых, что в if Скажите вам назначать от нуля до result, Другой в том, что connect возвращается -1 при невозможности подключения и неотрицательное значение, если ему удается подключиться.

Существует также проблема, заключающаяся в том, что если вам удастся подключиться, вы не закроете это подключение.

4

Другие решения

линия 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;
}
}
1

По вопросам рекламы [email protected]