2

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

含まれているすべての例/テストは問題なく機能するため、どこに問題があるのか​​ 本当にわかりません。

問題のあるコードはこちらです。問題がコード内にあるのか、それともライブラリの問題なのかはわかりません。

4

1 に答える 1

2

今日、私は自分のコードを熟考し、問題が解決するかどうかをランダムに試してみました. コード内のafreeが 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 がこれに気付かず、どういうわけかメモリがまだ使用されていることです。

于 2016-09-26T15:27:09.837 に答える