libwebsockets:如何通过请求存储IP地址

时间:2015-02-11 11:19:00

标签: c libwebsockets

当使用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}}初始化后。

任何帮助都会受到赞赏,因为我发现图书馆的文档很难理解。

2 个答案:

答案 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;关于这个特殊功能,但在运行一些测试之后它似乎正常工作。

我想知道是否有一种不那么迟钝的做法。