1

当使用 libwebsockets 作为服务器时,我很难理解我应该如何捕获客户端 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

我已经测试了strncpy另一个回调(LWS_CALLBACK_HTTP)的内部,所以我知道它在初始化后应该可以工作。pss

任何帮助将不胜感激,因为我发现该库的文档很难理解。

4

2 回答 2

2

你几乎拥有它。

如果您将 替换为(int)(long)inlibwebsocket_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);
             ...
}

输出:

从 xxxxxxxx.dip0.t-ipconnect.de (93.208.91.xxx) 收到网络连接

于 2015-04-08T13:56:14.590 回答
0

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

令我担心的是,关于这个特定功能,文档说“除非你做一些特别的事情,否则你不需要这个”,但在运行一些测试后它似乎可以正常工作。

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

于 2015-02-11T12:12:21.807 回答