【问题标题】:Get remote address by SOCKET-identifier in a recv-hook在 recv-hook 中通过 SOCKET-identifier 获取远程地址
【发布时间】:2013-05-03 06:31:32
【问题描述】:

我在 Ws2_32.dll 中的recv-函数上安装了一个挂钩。现在,当调用recv 时,我想获取有关谁发送了信息的信息。所以我尝试了以下方法来获取发件人的远程地址,但我得到的地址总是错误的,对于互联网来说非常不现实(例如我得到 2.0.0.80)。

我做错了什么?

int __stdcall TcpHook::my_recv(SOCKET s, char *buf, int len, int flags)
{
    sockaddr addr;
    int len2 = sizeof(addr);
    getpeername(s, &addr, &len2);

    char *sender = inet_ntoa(*(in_addr*)&addr);
    // print out sender etc.

    return tcpHook.recvOriginal(s, buf, len, flags);
}

有趣的是,尽管传递了s(输入SOCKET),但我没有任何信息。

【问题讨论】:

  • 您没有检查getpeername 的返回值。另外,我们不知道你是怎么上钩的;如果钩子没有在拥有套接字的进程中执行,你会得到垃圾。
  • 钩子当然和原来的socket在同一个进程中。我不检查结果,因为这是概念证明。我知道我应该这样做,但这不是错。
  • 检查 sockaddr 的 ss_family,这可能不是 IPv4 地址
  • 是 IPv4。我在另一个线程中找到了一个有趣的答案:stackoverflow.com/a/8114503/1433564 - 请参阅 cmets。所描述的情况似乎与我的情况相符,这可以解释为什么我得到错误的结果。
  • 是的,如果这是一个无连接套接字,就会发生这种情况。

标签: c++ sockets winapi


【解决方案1】:

我找到了解决方案...我只是失败了。 正确的代码是:

inet_ntoa((*(sockaddr_in*)&addr).sin_addr);

有效。

【讨论】:

  • 这取决于sockaddr_insockaddr 的大小相同。这恰好是真的。一般情况下,调用getpeername()时应使用正确类型的addr
猜你喜欢
  • 1970-01-01
  • 2010-09-09
  • 2020-08-19
  • 1970-01-01
  • 2021-08-05
  • 2016-02-29
  • 1970-01-01
  • 2018-10-11
  • 2012-08-05
相关资源
最近更新 更多