2015-02-11 66 views
1

當我使用libwebsockets作爲服務器時,我很難理解如何捕獲客戶端IP地址。libwebsockets:如何使用請求存儲IP地址

根據我對文檔的瞭解,libwebsockets_get_peer_addresses僅適用於LWS_CALLBACK_FILTER_NETWORK_CONNECTION回調,但此時用戶數據結構看起來並未初始化,因此任何在此存儲的嘗試都會出現segfault。

我本來希望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 

我測試過的另一個回調(LWS_CALLBACK_HTTP)內strncpy,所以我知道它應該工作時pss已初始化。

任何幫助將不勝感激,因爲我覺得圖書館的文檔很難理解。

回答

2

你已經差不多了。

如果用libwebsocket_get_socket_fd(wsi)更換(int)(long)in你可以在其它回調中使用它。

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)

+0

由於連接!我知道必須有比我一直使用的解決方法更加理智的事情。我只是希望我沒有這樣的麻煩讓我的頭文件... – GMemory 2015-04-08 14:24:29

0

好吧,看來我可以解決此通過獲得在以後的回調(如LWS_CALLBACK_HTTP

這令我擔憂的是,文件說「你不需要這個,除非你正在做使用libwebsocket_get_socket_fd描述符一些特殊的「關於這個特殊的功能,但它似乎運行幾個測試後正常工作。

我不知道這樣做是否有一種不那麼呆板的方式。