首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >libwebsockets:如何使用请求存储IP地址

libwebsockets:如何使用请求存储IP地址
EN

Stack Overflow用户
提问于 2015-02-11 11:19:00
回答 2查看 1.7K关注 0票数 1

当我使用libwebsocket作为服务器时,我很难理解我应该如何捕获客户机IP地址。

根据我对文档的了解,libwebsockets_get_peer_addresses只能在LWS_CALLBACK_FILTER_NETWORK_CONNECTION回调中使用,但此时用户数据结构似乎还没有初始化,所以任何在这里存储的尝试都会出现分段错误。

我本来希望IP地址在请求头中,就像Apache或nginx这样的其他web服务器一样,但是在这个库中,它似乎只对请求进程的某一部分可用,并且不被复制到报头中。

这就是我在LWS_CALLBACK_FILTER_NETWORK_CONNECTION中尝试的:

代码语言:javascript
复制
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被初始化时,它应该能工作。

如有任何帮助,我将不胜感激,因为我发现图书馆的文件很难理解。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-08 13:56:14

你差点就有了。

如果将(int)(long)in替换为libwebsocket_get_socket_fd(wsi),则可以在其他回调中使用它。

代码语言:javascript
复制
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)

票数 2
EN

Stack Overflow用户

发布于 2015-02-11 12:12:21

好的,看来我可以通过在以后的回调中使用libwebsocket_get_socket_fd获得描述符(比如LWS_CALLBACK_HTTP)来解决这个问题。

它让我担心的是,文档中说“除非您正在做一些特殊的事情”,否则您将不需要这个功能,但是在运行了几个测试之后,它似乎正确地工作了。

我想知道是否有一种不那么愚蠢的方式来做到这一点。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28453014

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档