【发布时间】:2020-02-12 01:07:33
【问题描述】:
我一直试图让一个简单的 SFTP 程序使用来自this 网站的代码,但我无法让它在不返回错误代码 10061 (WSAECONNREFUSED) 的情况下发送数据。我曾尝试在禁用所有防火墙的活动接口上使用 Wireshark,但它没有说明任何内容正在发送到我提供的地址(例如:72.196.212.127)。但是,当我给它一个像 192.168.1.101 这样的本地地址时,它给出了错误代码 10060 (WSAETIMEDOUT),仍然没有在网络上发送任何数据。我可以使用 Putty 和 WinSCP 等软件连接到两个地址上的目标计算机,并在命令提示符下 ping 它。
这里是我的连接方法的相关部分:
// 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;
}
【问题讨论】:
-
如果不发送连接请求,您将无法获得连接拒绝。修正你的标题。
-
代替这个:
sin.sin_addr.s_addr = to_uint32_t(ip);,调用这个inet_pton(AF_INET, ip, &sin.sin_addr);你可能需要#include<WS2tcpip.h>来获得inet_pton函数。 -
@user207421 如果我没记错的话,连接方法会发出一个连接请求,但它并没有这样做。我什么也没得到。
-
@selbie 做到了!
-
阅读我写的。它正在发出连接请求,拒绝连接就是证明。那是目标服务器的响应,告诉你目标端口没有监听。
标签: c++ networking winsock2