libwebsockets 客户端连接失败
libwebsockets client fails to connect
我正在使用 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
包含的所有 examples/tests 工作正常,所以我真的不确定我的问题出在哪里。
错误代码是 here - 我不确定问题是在我的代码中还是库问题。
我今天在思考我的代码,随机尝试一些事情看看它是否能解决问题。原来我代码中的 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 没有注意到这一点,并以某种方式允许内存继续使用。
我正在使用 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
包含的所有 examples/tests 工作正常,所以我真的不确定我的问题出在哪里。
错误代码是 here - 我不确定问题是在我的代码中还是库问题。
我今天在思考我的代码,随机尝试一些事情看看它是否能解决问题。原来我代码中的 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 没有注意到这一点,并以某种方式允许内存继续使用。