【发布时间】: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.rdi 是sockfd。但即使每次我得到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 名称解析.. -
我相信
getnameinfo和NI_NUMERICHOST是你想要的。 -
@R..: 你能给我举个例子吗..
标签: c sockets trace system-calls