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

时间:2010-06-15 17:57:28

标签: c sockets network-programming

我有一个用C编写的网络服务器应用程序,监听器使用INADDR_ANY绑定,因此它可以通过安装它的主机的任何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;
}

2 个答案:

答案 0 :(得分:8)

您可以使用getsockname功能。

  

getsockname()函数检索指定套接字的本地绑定名称

答案 1 :(得分:0)

从您的代码中

socketfd = accept(listener, (struct sockaddr *) &clientAddress, &length);

分析返回的clientAddress。这就是你需要的。