libwebsockets客户端无法连接

时间:2016-09-25 18:54:43

标签: c libwebsockets

我使用的是libwebsockets 2.0,并且我在使用它作为客户端连接到服务器时遇到了一些问题。

根据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 - 我不确定问题是否在我的代码中,或者是否是库问题。

1 个答案:

答案 0 :(得分: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没有接受这个,并且不知何故允许仍然使用内存。