我将我的进程(具有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或我做错了什么?
答案 0 :(得分:0)
如果您的要求是获取连接客户端的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)