当我使用libwebsocket作为服务器时,我很难理解我应该如何捕获客户机IP地址。
根据我对文档的了解,libwebsockets_get_peer_addresses只能在LWS_CALLBACK_FILTER_NETWORK_CONNECTION回调中使用,但此时用户数据结构似乎还没有初始化,所以任何在这里存储的尝试都会出现分段错误。
我本来希望IP地址在请求头中,就像Apache或nginx这样的其他web服务器一样,但是在这个库中,它似乎只对请求进程的某一部分可用,并且不被复制到报头中。
这就是我在LWS_CALLBACK_FILTER_NETWORK_CONNECTION中尝试的:
char client_name [IP_SIZE];
char client_ip [IP_SIZE];
libwebsockets_get_peer_addresses(context, wsi, (int)(long)in,
client_name, sizeof(client_name),
client_ip, sizeof(client_ip));
strncpy(pss->ip, client_ip, sizeof(client_ip)); // segfault我已经在另一个回调(LWS_CALLBACK_HTTP)中测试了这个pss,所以我知道当这个pss被初始化时,它应该能工作。
如有任何帮助,我将不胜感激,因为我发现图书馆的文件很难理解。
发布于 2015-04-08 13:56:14
你差点就有了。
如果将(int)(long)in替换为libwebsocket_get_socket_fd(wsi),则可以在其他回调中使用它。
switch (reason) {
case LWS_CALLBACK_HTTP:
int IP_SIZE = 50;
char client_name [IP_SIZE];
char client_ip [IP_SIZE];
libwebsockets_get_peer_addresses(context, wsi, libwebsocket_get_socket_fd(wsi),
client_name, sizeof(client_name),
client_ip, sizeof(client_ip));
fprintf(stderr, "Received network connect from %s (%s)\n",
client_name, client_ip);
...
}输出:
从xxxxxxx.dip0.t-ipconnect.de接收到的网络连接(93.208.91.xxx)
发布于 2015-02-11 12:12:21
好的,看来我可以通过在以后的回调中使用libwebsocket_get_socket_fd获得描述符(比如LWS_CALLBACK_HTTP)来解决这个问题。
它让我担心的是,文档中说“除非您正在做一些特殊的事情”,否则您将不需要这个功能,但是在运行了几个测试之后,它似乎正确地工作了。
我想知道是否有一种不那么愚蠢的方式来做到这一点。
https://stackoverflow.com/questions/28453014
复制相似问题