c - 如何确定连接到 C 中的 INADDR_ANY 监听器套接字的客户端使用的 IP

标签 c sockets network-programming

我有一个用 C 编写的网络服务器应用程序,监听器使用 INADDR_ANY 绑定(bind),因此它可以接受通过安装它的主机的任何 IP 地址的连接。

我需要确定客户端在建立连接时使用了哪个服务器的 IP 地址 - 实际上我只需要知道它们是否通过环回地址 127.0.0.1 连接。

部分代码示例如下(如果有帮助,我可以发布整个代码):

static struct sockaddr_in serverAddress;
serverAddress.sin_family = AF_INET;
serverAddress.sin_addr.s_addr = INADDR_ANY;
serverAddress.sin_port = htons(port);

bind(listener, (struct sockaddr *) &serverAddress, sizeof(serverAddress));

listen(listener, CONNECTION_BACKLOG);

SOCKET socketfd;
static struct sockaddr_in clientAddress;
...
socketfd = accept(listener, (struct sockaddr *) &clientAddress, &length);

下面显示了我的特定问题的解决方案(感谢 zildjohn01)以备不时之需:

int isLocalConnection(int socket){
    struct sockaddr_in sa;
    int sa_len = sizeof(sa);
    if (getsockname(socket, &sa, &sa_len) == -1) {
        return 0;
    }
    // Local access means any IP in the 127.x.x.x range
    return (sa.sin_addr.s_addr & 0xff) == 127;
}

最佳答案

您可以使用 getsockname功能。

The getsockname() function retrieves the locally-bound name of the specified socket

关于c - 如何确定连接到 C 中的 INADDR_ANY 监听器套接字的客户端使用的 IP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3047704/

相关文章:

c# - BeginSend<IList<ArraySegment....) 是否执行所有 ArraySegment 的原子发送?

Java 序列化与 JSON

c - 接收多条消息的socket编程C

使用C语言将1个列表的元素复制到另一个列表中

c - 如何将 stdin 从我的应用程序重定向到另一个知道其 PID 的应用程序(C,在 Windows 中)

node.js - Node.JS 应用程序出现 ERR_SERVER_ALREADY_LISTENING 错误,但仅限 10.2.1?

c# - 在断开连接时关闭客户端套接字

android - 一段时间后 UDP 传输停止

c - 我在比较时间戳时遇到段错误(核心转储)错误 (C)

c - 局部变长数组