如何来确定客户端连接到INADDR_ANY监听套接字用于C IP [英] How to determine IP used by client connecting to INADDR_ANY listener socket in C
问题描述
我用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屋!