【问题标题】:Getting ip address from a socket fd (not duplicate) [duplicate]从套接字 fd 获取 IP 地址(不重复)[重复]
【发布时间】:2014-12-08 08:01:48
【问题描述】:

我正在将我的进程(具有 root 权限)附加到浏览器进程,以使用 ptrace 拦截其系统调用。为了解码connect() 系统调用的参数,我得到了sockfd。但是我几天来一直在尝试获取该套接字另一端的ip address,但没有成功。

我在环顾四周时遇到了这两个问题

1)Get IP address from socket descriptor?

2)Getting IP address, port and connection type from a socket fd

我遵循了第一个问题的建议,但不知何故它给出了错误。某事error: ‘struct sockaddr_in’ has no member named ‘sa_data’。我深入研究了互联网并得到了另一个提示,我曾经编写过这段代码

temp = getpeername(regs.rdi, (struct sockaddr *)&ip_addr_struct, &ip_addr_structlen);
struct sockaddr_in *s = (struct sockaddr_in *)&ip_addr_struct;
int port = ntohs(s->sin_port);
inet_ntop(AF_INET, &s->sin_addr, ip_addr, 1024);
printf("%d-%s\n", port, ip_addr);

这里的regs.rdisockfd。但即使每次我得到0-0.0.0.0 作为输出时都有这段代码。请帮助任何人。有没有其他方法可以获取 ip addrres 还是我做错了什么?

【问题讨论】:

  • 试试 getaddrinfo()。 linux.die.net/man/3/getaddrinfo in_addr 应该是您应该尝试使用 sockaddr_in 变量/指针访问的字段。使用 pton() 或 ntop() 转换其格式。 msdn.microsoft.com/en-us/library/zx63b042.aspx
  • @a4anurag:我正在使用 sockaddr_in 指针访问sin_addr,即s。我不太明白pton()ntop() 会做什么。请多解释一下
  • @a4anurag: getaddrinfo() 用于 dns 名称解析..
  • 我相信getnameinfoNI_NUMERICHOST是你想要的。
  • @R..: 你能给我举个例子吗..

标签: c sockets trace system-calls


【解决方案1】:

如果您的要求是获取连接客户端的 IP 地址,请使用此 :)

struct sockaddr_in their_addr;

if ((*cli_fd = accept(listener, (struct sockaddr *)&their_addr,&sin_size)) == -1)
{
    close (*cli_fd);
    return -1;
}

This is the client ip address ==> inet_ntoa(their_addr.sin_addr)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-14
    • 2013-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-01
    • 2013-08-19
    相关资源
    最近更新 更多