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)
我很难理解在使用 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)