Я пытался получить простую программу 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;
}