libwebsockets:如何在请求中存储 IP 地址

libwebsockets: how to store IP address with request

我很难理解在使用 libwebsockets 作为服务器时应该如何捕获客户端 IP 地址。

根据我对文档的理解,libwebsockets_get_peer_addresses 仅可用于 LWS_CALLBACK_FILTER_NETWORK_CONNECTION 回调,但此时用户数据结构似乎未初始化,因此任何存储的尝试这里会出现段错误。

我原以为 IP 地址会出现在请求 headers 中,就像 Apache 或 nginx 等其他网络服务器一样,但在这个库中,它似乎只适用于特定部分的请求进程并没有复制到headers.

这就是我在里面尝试的 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) 中测试了 strncpy,所以我知道它 应该 pss 有已初始化。

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

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

我担心文档说“你不需要这个,除非你正在做一些特殊的事情”关于这个特定的功能,但它似乎在 [=20 之后工作正常=] 一些测试。

我想知道是否有更简单的方法。

你几乎成功了。

如果将 (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);
             ...
}

输出:

收到来自 xxxxxxxx 的网络连接。dip0.t-ipconnect.de (93.208.91.xxx)