【问题标题】:WinSock2: connect() delivers 'connection refused'WinSock2:connect() 提供“连接被拒绝”
【发布时间】: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, &amp;sin.sin_addr);你可能需要#include&lt;WS2tcpip.h&gt;来获得inet_pton函数。
  • @user207421 如果我没记错的话,连接方法会发出一个连接请求,但它并没有这样做。我什么也没得到。
  • @selbie 做到了!
  • 阅读我写的。它正在发出连接请求,拒绝连接就是证明。那是目标服务器的响应,告诉你目标端口没有监听。

标签: c++ networking winsock2


【解决方案1】:

@selbie 指出我没有使用正确的函数来解析 IP。为了修复我的代码,我刚刚将sin.sin_addr.s_addr = to_uint32_t(ip); 切换为inet_pton(AF_INET, ip, &amp;sin.sin_addr);

【讨论】:

  • 根本问题是您的 to_uint32_t 函数忘记调用htonl。但是,考虑到inet_pton 和类似调用的可用性,您确实不需要实现该功能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-01
  • 1970-01-01
  • 2017-08-08
  • 2021-11-21
  • 1970-01-01
  • 2019-10-26
  • 1970-01-01
相关资源
最近更新 更多