当使用libwebsockets作为服务器时,我很难理解我应该如何捕获客户端IP地址。
根据我对文档的理解,libwebsockets_get_peer_addresses
仅可用于LWS_CALLBACK_FILTER_NETWORK_CONNECTION
回调,但此时用户数据结构似乎未初始化,因此任何在此存储的尝试都将段错误。
我希望IP地址位于请求标头中,如其他Web服务器(如Apache或nginx),但在此库中,它似乎仅适用于请求过程的某个部分,并且不会被复制进入标题。
这就是我在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
,所以我知道 应该<{1}}初始化后。
任何帮助都会受到赞赏,因为我发现图书馆的文档很难理解。
答案 0 :(得分:2)
你几乎拥有它。
如果您将(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)收到网络连接
答案 1 :(得分:0)
好的,似乎我可以通过在稍后的回调中使用libwebsocket_get_socket_fd
获取描述符来解决这个问题(例如LWS_CALLBACK_HTTP
)
我担心文件说&#34; 除非你正在做一些特别的事情,否则你不需要这样做&#34;关于这个特殊功能,但在运行一些测试之后它似乎正常工作。
我想知道是否有一种不那么迟钝的做法。