【问题标题】:Getting the source address of an incoming socket connection获取传入套接字连接的源地址
【发布时间】:2011-01-05 02:20:51
【问题描述】:

我有一个带有来自客户端的传入套接字的服务器。 我需要获取远程客户端的 IP 地址。 尝试在谷歌搜索in_addr,但这有点麻烦。 有什么建议吗?

【问题讨论】:

标签: c sockets ip


【解决方案1】:

你需要getpeername function:

// assume s is a connected socket

socklen_t len;
struct sockaddr_storage addr;
char ipstr[INET6_ADDRSTRLEN];
int port;

len = sizeof addr;
getpeername(s, (struct sockaddr*)&addr, &len);

// deal with both IPv4 and IPv6:
if (addr.ss_family == AF_INET) {
    struct sockaddr_in *s = (struct sockaddr_in *)&addr;
    port = ntohs(s->sin_port);
    inet_ntop(AF_INET, &s->sin_addr, ipstr, sizeof ipstr);
} else { // AF_INET6
    struct sockaddr_in6 *s = (struct sockaddr_in6 *)&addr;
    port = ntohs(s->sin6_port);
    inet_ntop(AF_INET6, &s->sin6_addr, ipstr, sizeof ipstr);
}

printf("Peer IP address: %s\n", ipstr);

【讨论】:

  • +1。但是我们不需要为此释放任何内存吗?
  • 我注意到struct sockaddr_in *s 在外部范围内遮蔽了套接字s。有一个阴影变量并不理想。
  • 有没有办法从地址中获取socketDescriptor
  • @RecolicKeghart 试试 Wayback 机器 :)
  • @brk 它有效!如果您也遇到 404,请使用this link
【解决方案2】:

假设您使用accept() 接受传入的套接字连接,则不需要getpeername()。地址信息可通过accept() 调用的第二个和第三个参数获得。

这是 Eli 的答案修改为没有getpeername()

int client_socket_fd;
socklen_t len;
struct sockaddr_storage addr;
char ipstr[INET6_ADDRSTRLEN];
int port;

len = sizeof addr;
client_socket_fd = accept(server_socket_fd, (struct sockaddr*)&addr, &len);

// deal with both IPv4 and IPv6:
if (addr.ss_family == AF_INET) {
    struct sockaddr_in *s = (struct sockaddr_in *)&addr;
    port = ntohs(s->sin_port);
    inet_ntop(AF_INET, &s->sin_addr, ipstr, sizeof ipstr);
} else { // AF_INET6
    struct sockaddr_in6 *s = (struct sockaddr_in6 *)&addr;
    port = ntohs(s->sin6_port);
    inet_ntop(AF_INET6, &s->sin6_addr, ipstr, sizeof ipstr);
}

printf("Peer IP address: %s\n", ipstr);

【讨论】:

  • +1 直接使用accept()。但是我们不需要为此释放任何内存吗?
  • @iammilind:我认为不需要释放任何内存——我看不到任何动态分配正在完成。这一切都是通过静态分配的变量完成的。
【解决方案3】:

由于您说它是来自客户端的传入连接,作为getpeername 的替代方法,您可以将accept() 调用返回的地址保存在第二个和第三个参数中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-16
    • 1970-01-01
    相关资源
    最近更新 更多