如何来确定客户端连接到INADDR_ANY监听套接字用于C IP [英] How to determine IP used by client connecting to INADDR_ANY listener socket in C

查看:170
本文介绍了如何来确定客户端连接到INADDR_ANY监听套接字用于C IP的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我用C编写的网络服务器应用程序,监听器使用INADDR_ANY,因此它可以接受通过任何安装了它的主机的IP地址的连接约束。

我需要确定哪些服务器的IP地址建立的连接时使用的客户端 - 其实我只需要知道他们是否通过环回地址127.0.0.1连接与否

偏code样品如下(我可以张贴整个事情,如果有帮助):

 静态结构SOCKADDR_IN serverAddress;
serverAddress.sin_family = AF_INET;
serverAddress.sin_addr.s_addr = INADDR_ANY;
serverAddress.sin_port = htons(端口);绑定(监听器,(结构sockaddr *)及serverAddress,sizeof的(serverAddress));听(监听器,CONNECTION_BACKLOG);SOCKET socketfd;
静态结构SOCKADDR_IN clientAddress;
...
socketfd =接受(监听器,(结构sockaddr *)及clientAddress,&安培;长度);

解决我的特定问题(感谢zildjohn01)的情况下,任何人都需要它,如下所示:

  INT isLocalConnection(INT插座){
    结构SOCKADDR_IN SA;
    INT sa_len = sizeof的(SA);
    如果(getsockname(插座,&安培; SA,&安培; sa_len)== -1){
        返回0;
    }
    //本地访问是指在127.x.x.x范围内的任何IP
    回报(sa.sin_addr.s_addr&安培;为0xFF)== 127;
}


解决方案

您可以使用 getsockname 功能。


  

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


I have a network server application written in C, the listener is bound using INADDR_ANY so it can accept connections via any of the IP addresses of the host on which it is installed.

I need to determine which of the server's IP addresses the client used when establishing its connection - actually I just need to know whether they connected via the loopback address 127.0.0.1 or not.

Partial code sample as follows (I can post the whole thing if it helps):

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);

The solution to my specific problem (thanks to zildjohn01) in case anyone needs it, is shown below:

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;
}

解决方案

You can use the getsockname function.

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

这篇关于如何来确定客户端连接到INADDR_ANY监听套接字用于C IP的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆