从套接字fd获取ip地址(不重复)

时间:2014-10-13 17:14:50

标签: c sockets trace system-calls

我将我的进程(具有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或我做错了什么?

1 个答案:

答案 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)