WinSock2: connect () доставляет «отказано в соединении» - PullRequest
0 голосов
/ 12 февраля 2020

Я пытался получить простую программу SFTP, работающую с кодом с этого веб-сайта, но я не смог заставить ее даже отправлять данные без возврата кода ошибки 10061 (WSAECONNREFUSED). Я пытался использовать Wireshark на активном интерфейсе со всеми отключенными брандмауэрами, но он не говорил, что что-то отправлялось по указанному мною адресу (например: 72.196.212.127). Однако, когда я даю ему локальный адрес, такой как 192.168.1.101, он выдает код ошибки 10060 (WSAETIMEDOUT), по-прежнему не отправляя никаких данных в сеть. Я могу подключиться к целевому компьютеру по обоим адресам с помощью программного обеспечения, такого как Putty и WinSCP, и пропинговать его в командной строке.

Вот соответствующая часть моего метода подключения:

// Open socket
WSADATA data;
int err = WSAStartup(MAKEWORD(2, 0), &data);
if (err != 0) return "ERROR: Failed to initialize WSA";

sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
struct sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(port);
sin.sin_addr.s_addr = to_uint32_t(ip);

if (net::connect(sock, (struct sockaddr*) &sin, sizeof(struct sockaddr_in)) != 0) return "ERROR: Could not connect to host. Code: " + std::to_string(WSAGetLastError());

Переменная port является целым числом (значение = 22), при этом ip является строкой (192.168.1.101 или 72.196.212.127). Эта функция возвращает ошибку «Не удалось подключиться к хосту». Других ошибок не возникает.

Вот метод to_uint32_t:

std::uint32_t to_uint32_t(const std::string& ip_address)
{
    const unsigned bits_per_term = 8;
    const unsigned num_terms = 4;

    std::istringstream ip(ip_address);
    uint32_t packed = 0;

    for (unsigned i = 0; i < num_terms; ++i)
    {
        unsigned term;
        ip >> term;
        ip.ignore();

        packed += term << (bits_per_term * (num_terms - i - 1));
    }

    return packed;
}

1 Ответ

0 голосов
/ 12 февраля 2020

@ selb ie указал, что я не использовал правильную функцию для разрешения IP. Чтобы исправить мой код, я просто переключил sin.sin_addr.s_addr = to_uint32_t(ip); на inet_pton(AF_INET, ip, &sin.sin_addr);.

...