2016-09-25 390 views
2

我正在使用libwebsockets 2.0,并且遇到一些问题,试图连接到使用它作为客户端的服务器。libwebsockets客户端无法连接

按照libwebsockets日志,这是当我相当简单的客户端试图连接到echo.websocket.org会发生什么:

[2016/09/25 19:22:56:9033] INFO: lws_header_table_attach: wsi 0x7fe32402a680: ah (nil) (tsi 0, count = 0) in 
[2016/09/25 19:22:56:9034] INFO: lws_header_table_attach: wsi 0x7fe32402a680: ah 0x7fe3240078f0: count 1 (on exit) 
[2016/09/25 19:22:56:9034] CLIENT: lws_client_connect: direct conn 
[2016/09/25 19:22:56:9034] CLIENT: lws_client_connect_2 
[2016/09/25 19:22:56:9034] CLIENT: lws_client_connect_2: address 
[2016/09/25 19:22:56:9044] ERR: getaddrinfo failed 
Callback LWS_CALLBACK_CLIENT_CONNECTION_ERROR (1) 
Connection error: (25) getaddrinfo (ipv4) failed 

根据这个日志,这似乎说getaddrinfo失败了,但它上面的行(应该输出libwebsockets连接的地址)返回一个空字符串。

更加古怪,当我运行通过Valgrind的我的测试代码,一切似乎都很好地工作:

[2016/09/25 19:46:17:7566] INFO: lws_header_table_attach: wsi 0x6714970: ah (nil) (tsi 0, count = 0) in 
[2016/09/25 19:46:17:7598] INFO: lws_header_table_attach: wsi 0x6714970: ah 0x65b35c0: count 1 (on exit) 
[2016/09/25 19:46:17:7665] CLIENT: lws_client_connect: direct conn 
[2016/09/25 19:46:17:7670] CLIENT: lws_client_connect_2 
[2016/09/25 19:46:17:7680] CLIENT: lws_client_connect_2: address echo.websocket.org 
[2016/09/25 19:46:17:9511] DEBUG: insert_wsi_socket_into_fds: 0x6714970: tsi=0, sock=6, pos-in-fds=1 

所有的例子包括/测试工作得很好,所以我真的不知道在哪里我的问题是。

有问题的代码是here - 我不确定问题出在我的代码中还是它是一个库问题。

+0

“但它上面的行(它应该输出libwebsockets连接的地址)正在返回一个空字符串。” - 那么这是你的问题,一个空字符串大概不是一个有效的地址。您应该尝试连接到非空地址。 – immibis

回答

2

我今天在想我的代码,尝试随机的东西,看看它是否会解决这个问题。原来在我的代码free是造成问题与libwebsockets:

char* address_internal = malloc(strlen(address) + 1); 
memcpy(address_internal, address, strlen(address)); 

/*...*/ 

free(address_internal); 

删除free(address_internal);允许代码Valgrind的外部正常工作。

我猜测问题是lws_parse_uri没有创建自己的内部副本,文档没有明确提及。奇怪的是,Valgrind没有接受这一点,并以某种方式让记忆仍然被使用。