2015-05-19 250 views
4

我想創建一個使用libwebsockets的C++ websocket客戶端,但我無法建立連接,因爲它超時。我已經剝離下來,用於測試和這裏是我用來建立連接的:如何防止libwebsockets客戶端超時

協議

static int defaultCallback(
    struct libwebsocket_context* context, 
    struct libwebsocket* wsi, 
    enum libwebsocket_callback_reasons reason, 
    void* user, 
    void* in, 
    size_t len) 
{ 
    return 0; 
} 

static struct libwebsocket_protocols protocols[] = { 
    { "default", defaultCallback, 0 }, 
    { NULL, NULL, 0 } 
}; 

創建上下文

struct lws_context_creation_info info; 
    memset(&info, 0, sizeof(info)); 
    info.port = CONTEXT_PORT_NO_LISTEN; 
#ifndef LWS_NO_EXTENSIONS 
    info.extensions = libwebsocket_get_internal_extensions(); 
#endif 
    info.gid = -1; 
    info.uid = -1; 
    info.protocols = protocols; 

    _context = libwebsocket_create_context(&info); 

創建客戶端

注意:地址「ws:// localhost」我也試過「ws://echo.websocket.org」。本地主機服務器是一個節點& ws應用程序,我已經使用Chrome進行了測試並且工作完美。

_websocket = libwebsocket_client_connect(_context, // context 
             _address.c_str(), // address 
             _port, // port 
             0, // use ssl? 
             "/", // path 
             _address.c_str(), // host 
             NULL, // origin 
             NULL, // protocol 
             -1); // version 

服務上下文

while(1) { 
    libwebsocket_service(_context, 50); 
} 

輸出 當我運行上述這是輸出我通過libwebsockets獲得登錄回調:

NOTICE: Initial logging level 1023 
NOTICE: Library version: 1.4 3ae1bad 
NOTICE: IPV6 not compiled in 
NOTICE: libev support not compiled in 
INFO: LWS_MAX_HEADER_LEN: 1024 
INFO: LWS_MAX_PROTOCOLS: 5 
INFO: SPEC_LATEST_SUPPORTED: 13 
INFO: AWAITING_TIMEOUT: 5 
INFO: SYSTEM_RANDOM_FILEPATH: '/dev/urandom' 
INFO: LWS_MAX_ZLIB_CONN_BUFFER: 65536 
NOTICE: static allocation: 4536 + (16 x 10240 fds) = 168376 bytes 
INFO: LWS_MAX_EXTENSIONS_ACTIVE: 3 
NOTICE: canonical_hostname = an-iMac 
NOTICE: per-conn mem: 248 + 2140 headers + protocol rx buf 
PARSER: Protocol: default 
CLIENT: libwebsocket_client_connect: direct conn 
CLIENT: libwebsocket_client_connect_2 
CLIENT: libwebsocket_client_connect_2: address ws://localhost 
INFO: insert_wsi_socket_into_fds: wsi=0x7ff808514c70, sock=8, fds pos=1 
CLIENT: nonblocking connect retry 
INFO: TIMEDOUT WAITING on 2 
DEBUG: close: just_kill_connection 
INFO: remove_wsi_socket_from_fds: wsi=0x7ff808514c70, sock=8, fds pos=1 
DEBUG: Connection closed before server reply 

我已經看着所有的libwebsockets示例/文檔,我可以得到我的手和c沒有關於如何解決這個問題的任何信息。任何幫助將不勝感激,並防止我把我的頭穿過我的顯示器。

+0

什麼端口?一些低數量的端口是安全的。 –

+0

我已經嘗試了各種端口:80,8080,9000,3333等。正如我所提到的,與本地主機我有一個服務器運行,我可以連接到基於瀏覽器的websocket客戶端,所以理論上港口和地址應該起作用。 – Huhwha

+0

我覺得我寫了這個問題,我在同一條船上。我站在一個ws服務器的節點上,並使用chrome擴展名和websocket.org的echo形式成功打開它。我在調試中運行libwebsockets,但它只是發佈「連接在服務器應答之前關閉」/ LWS_CALLBACK_CLIENT_CONNECTION_ERROR。我想是時候啓動wireshark了。 – moodboom

回答

0

嘗試不帶「ws://」的地址。只是簡單的「本地主機」,或「127.0.0.1」。

0

要小心端口設置,如果您使用端口協議,則不能單獨指定端口。端口8090將與443在這裏overridded,不要做這種方式:

# WRONG 
./lws_test_client wss://192.168.202.120 --port=8090 

相反,指定端口作爲URL的一部分:

./lws_test_client wss://192.168.202.120:8090 

詳細...

我很難確定libwebsockets客戶端的初始握手嘗試是怎麼回事。 (通過Chrome擴展或websockets.org的echo服務)和節點WS服務器看着瀏覽器之間的健康會議上,我獲得了大量的握手包:

enter image description here

從libwebsockets客戶端,我不t看到客戶端在ALL發送的任何數據包。

以超級用戶身份運行並沒有幫助。我可以telnet到服務器,至少可以看到一點流量。測試客戶出了什麼問題。

我正在使用來自主分支的最新代碼,也許這是問題的一部分,接下來我將切換回舊版本。

UPDATE:問題在這裏解決。我從安迪本人,libwebsockets作者的郵件列表中獲得了幫助。他在我的命令行中更正了我的客戶端端口規範。一旦我正確指定了端口,我就有了一個連接客戶端。這是對這個Q & A的其他答案的更深層的解釋,實際上這個答案也是一樣的。我希望它和你一樣是一個問題。

# DO NOT USE: ./lws_test_client wss://192.168.202.120 --port=8090 
# "wss://" will override the specific port provided! 
# INSTEAD, specify it as part of the url. 
./lws_test_client wss://192.168.202.120:8090 
+0

您可以發佈一個鏈接到郵件列表線程? – Greg

+1

https:/ /libwebsockets.org/pipermail/libwebsockets/2016-June/002588.html – moodboom