Как пинговать другой компьютер в той же локальной сети, используя ACE?

Мне нужно скопировать файлы на удаленный компьютер. Прежде чем сделать это, мне нужно проверить, доступен ли ПК. Я пытался с помощью ACE_OS::stat() проверить, существует ли каталог. На некоторых платформах это время ожидания вполне достаточно для меня, но на других платформах программа зависает.

ACE предлагает ACE_Ping_Socket, поэтому я предполагаю, что он делает то, что я хочу. Тем не менее, я не могу заставить его работать, даже с LOCALHOST. Кто-нибудь знает, как это сделать?

#include "ace/Ping_Socket.h"
#include "ace/INET_Addr.h"

int main(int argc, char * argv[])
{
    ACE_INET_Addr addr;

    // instead of 127.0.0.1, insert IP of a remote PC
    int i_set = addr.set("127.0.0.1:0");

    ACE_Ping_Socket s;
    int i_open = s.open(addr);

    // if open works, PC is reachable, at least this is the idea...
    // i_set = 0, but i_open = -1, even for 127.0.0.1
    return 0;
}

Я также открыт для альтернатив ACE:-)

1 ответ

Решение

Следующее работает хорошо. pacHost может быть IP-адресом (например, "127.0.0.1") или именем хоста (например, ACE_LOCALHOST).

static bool isReachable(unsigned int uiPort, const char * pacHost, unsigned int uiTimeOutSeconds)
{
    ACE_INET_Addr srvr(uiPort, pacHost);

    ACE_SOCK_Connector connector;
    ACE_SOCK_Stream peer;
    const ACE_Time_Value timeout (uiTimeOutSeconds);

    if (-1 == connector.connect(peer, srvr, &timeout))
    {
        return false;
    }

    peer.close();
    return true;
}

В моем случае порт 445 для использования протокола SMB.

Другие вопросы по тегам