<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css" style="display:none;"><!-- P {margin-top:0;margin-bottom:0;} --></style>
</head>
<body dir="ltr">
<div id="divtagdefaultwrapper" style="font-size:12pt;color:#000000;font-family:Calibri,Arial,Helvetica,sans-serif;" dir="ltr">
<p>One last question I have,</p>
<p>By reusing same lws_context over and over again and constantly just connecting to new targets each time...are there any potential memory leaks in libwebsockets that could be leaking because I am not doing a destroy?</p>
<br>
<br>
<div style="color: rgb(0, 0, 0);">
<hr tabindex="-1" style="display:inline-block; width:98%">
<div id="divRplyFwdMsg" dir="ltr"><font face="Calibri, sans-serif" color="#000000" style="font-size:11pt"><b>From:</b> Ash 20001 <ash20001@hotmail.com><br>
<b>Sent:</b> Friday, June 16, 2017 12:15 PM<br>
<b>To:</b> Andy Green; libwebsockets@ml.libwebsockets.org<br>
<b>Subject:</b> Re: [Libwebsockets] Is there a way to reuse a lws_context without destroying it</font>
<div> </div>
</div>
<div>
<div id="divtagdefaultwrapper" dir="ltr" style="font-size:12pt; color:#000000; font-family:Calibri,Arial,Helvetica,sans-serif">
<p>So after making two changes to my code I think the issue is solved:</p>
<p></p>
<ol style="margin-bottom:0px; margin-top:0px">
<li>Explicitly send an lws_callback_writeable and have the callback return -1 to close the client connection</li><li>Run everything in the same thread, including the lws connect with info call, which I wasn't doing before. </li></ol>
<p></p>
<br>
<br>
<div style="color:rgb(0,0,0)">
<div>
<hr tabindex="-1" style="display:inline-block; width:98%">
<div id="x_divRplyFwdMsg" dir="ltr"><font face="Calibri, sans-serif" color="#000000" style="font-size:11pt"><b>From:</b> Andy Green <andy@warmcat.com><br>
<b>Sent:</b> Thursday, June 15, 2017 4:04 PM<br>
<b>To:</b> Ash 20001; libwebsockets@ml.libwebsockets.org<br>
<b>Subject:</b> Re: [Libwebsockets] Is there a way to reuse a lws_context without destroying it</font>
<div> </div>
</div>
</div>
<font size="2"><span style="font-size:10pt">
<div class="PlainText"><br>
<br>
On 06/16/2017 03:57 AM, Ash 20001 wrote:<br>
> I tried to reproduce it with libwebsocket-test-server and test-client <br>
> with 2 servers on separate ports but could not with the example.<br>
> <br>
> <br>
> In my application I have been able to reproduce it on the same port <br>
> itself and when I reconnected using the same context I see this:<br>
> <br>
> <br>
> 140  :  2017/6/15 12:53:09.397DBG  :  [26988] lws: <br>
> insert_wsi_socket_into_fds: 0x7f5c2c01fa40: tsi=0, sock=13, pos-in-fds=1<br>
> sigReconnectHandler: caught signal 3... reconnecting<br>
> 477  :  2017/6/15 12:53:24.708DBG  :  [27038] lws: <br>
> insert_wsi_socket_into_fds: 0x7f5c2c01fbe0: tsi=0, sock=14, pos-in-fds=2<br>
> sigReconnectHandler: caught signal 3... reconnecting<br>
> 627  :  2017/6/15 12:53:31.352DBG  :  [27074] lws: <br>
> insert_wsi_socket_into_fds: 0x7f5c2400fe20: tsi=0, sock=13, pos-in-fds=2<br>
> sigReconnectHandler: caught signal 3... reconnecting<br>
> 1115 :  2017/6/15 12:53:37.216DBG  :  [27109] lws: <br>
> insert_wsi_socket_into_fds: 0x7f5c24000e90: tsi=0, sock=15, pos-in-fds=3<br>
> sigReconnectHandler: caught signal 3... reconnecting<br>
> 1270 :  2017/6/15 12:53:42.761DBG  :  [27145] lws: <br>
> insert_wsi_socket_into_fds: 0x7f5c1c0014a0: tsi=0, sock=13, pos-in-fds=3<br>
> sigReconnectHandler: caught signal 3... reconnecting<br>
> 1783 :  2017/6/15 12:53:48.660DBG  :  [27181] lws: <br>
> insert_wsi_socket_into_fds: 0x7f5c1c002700: tsi=0, sock=16, pos-in-fds=4<br>
> 1926 :  2017/6/15 12:53:52.921DBG  :  [27209] lws: <br>
> insert_wsi_socket_into_fds: 0x7f5c1c000ca0: tsi=0, sock=13, pos-in-fds=4<br>
> sigReconnectHandler: caught signal 3... reconnecting<br>
> 2411 :  2017/6/15 12:53:54.316DBG  :  [27241] lws: <br>
> insert_wsi_socket_into_fds: 0x7f5c1c001350: tsi=0, sock=17, pos-in-fds=5<br>
> <br>
> To me that means that sockets aren't getting cleaned up. In addition I <br>
<br>
They might not even be being closed depending on what changes you made.<br>
<br>
On Linux, if you know your PID<br>
<br>
$ ps fax | grep test-cli<br>
11879 pts/2    R+     0:41  |   |   \_ libwebsockets-test-client localhost<br>
<br>
You can externally look at what fds the process has open<br>
<br>
$ ls -l /proc/11879/fd<br>
total 0<br>
lrwx------. 1 agreen agreen 64 Jun 16 06:57 0 -> /dev/pts/2<br>
lrwx------. 1 agreen agreen 64 Jun 16 06:57 1 -> /dev/pts/2<br>
lrwx------. 1 agreen agreen 64 Jun 16 06:56 2 -> /dev/pts/2<br>
lr-x------. 1 agreen agreen 64 Jun 16 06:57 3 -> /dev/urandom<br>
lr-x------. 1 agreen agreen 64 Jun 16 06:57 4 -> pipe:[795470]<br>
l-wx------. 1 agreen agreen 64 Jun 16 06:57 5 -> pipe:[795470]<br>
lrwx------. 1 agreen agreen 64 Jun 16 06:57 6 -> socket:[795479]<br>
lrwx------. 1 agreen agreen 64 Jun 16 06:57 7 -> socket:[796963]<br>
<br>
That's after leaving the client running for a few minutes on unchanged <br>
master test-client.  So it is closing the old sockets fine.<br>
<br>
If it's not Linux, actually the reuse-of-lowest-fd strategy is not <br>
mandatory, open can monotonically increment the fd and wrap to reuse <br>
older ones on other platforms (ie, lwip on ESP32 does this).<br>
<br>
> have found cases in wireshark when after I have connected with one port, <br>
> another SYN starts from a different port within the libwebsockets code. <br>
> I don't understand this.<br>
<br>
If you can show the test apps doing it, I will worry about it.<br>
<br>
> One question I have is that if I reconnect using the same context on a <br>
> different thread each time, would that cause problems?<br>
<br>
You should only do this stuff from the same thread that is doing the <br>
service.<br>
<br>
-Andy<br>
<br>
> <br>
> <br>
> <br>
> ------------------------------------------------------------------------<br>
> *From:* Andy Green <andy@warmcat.com><br>
> *Sent:* Thursday, June 15, 2017 1:39 AM<br>
> *To:* Ash 20001; libwebsockets@ml.libwebsockets.org<br>
> *Subject:* Re: [Libwebsockets] Is there a way to reuse a lws_context <br>
> without destroying it<br>
> <br>
> <br>
> On 06/15/2017 04:24 PM, Ash 20001 wrote:<br>
>> It looks like the second time I connect to a different port (with same <br>
>> context), I see some packets being sent on the first port (which is <br>
>> supposed to be closed). It's almost as if there are two sockets sitting <br>
> <br>
> Mm doubt it.<br>
> <br>
> It's normal for some (zero payload length) tcp stuff housekeeping to fly<br>
> around.<br>
> <br>
>> around, and one is trying to connect back to the first port and the <br>
>> other is also connecting to the second port. This seems to be messing up <br>
>> my callbacks. If this is the problem, is there any way to clean up this <br>
>> old socket state without explicitly called destroy_context?<br>
> <br>
> What I think would be good is find some way for me to reproduce this<br>
> using the test server etc.<br>
> <br>
> Like run 2 x test servers on different ports, and add a small hack on<br>
> test client so that it switches between the two servers each time.  It<br>
> should be fairly easy.<br>
> <br>
> If that shows the problem, well, I guess it's my problem.  If it works,<br>
> then the problem is tied up with your code.  It might sounds like "oh<br>
> but that's not moving me forward" but actually either way you will learn<br>
> something good for where the problem is (and get it solved by me if I<br>
> can reproduce it with your changes to my pieces).<br>
> <br>
> -Andy<br>
> <br>
>> <br>
>> <br>
>> ------------------------------------------------------------------------<br>
>> *From:* Andy Green <andy@warmcat.com><br>
>> *Sent:* Thursday, June 15, 2017 12:07 AM<br>
>> *To:* Ash 20001; libwebsockets@ml.libwebsockets.org<br>
>> *Subject:* Re: [Libwebsockets] Is there a way to reuse a lws_context <br>
>> without destroying it<br>
>> <br>
>> <br>
>> On 06/15/2017 02:43 PM, Ash 20001 wrote:<br>
>>>  1. lws 2.2 made no difference<br>
>>>  2. i took a wireshark capture and found out the server indeed was<br>
>>>     sending a FIN to the client. But the same server if I don't reuse<br>
>>>     the context, it works, no spurious FIN. The server is running a java<br>
>>>     version of websockets.  Any idea why context reuse could be screwing<br>
>>>     up the server? i assume some state somewhere in the context. <br>
>>><br>
>> <br>
>> As I said look at what is sent with, eg, tcpdump -s0 -X.<br>
>> <br>
>> If state in lws context decides it, but the remote side executes it, it<br>
>> can only be that the remote side 'knew' the state by something lws sent<br>
>> to it.<br>
>> <br>
>> Look at what if anything is different about what you send to the host<br>
>> the first and second time.<br>
>> <br>
>> -Andy<br>
>> <br>
>>> <br>
>>> <br>
>>> <br>
>>> ------------------------------------------------------------------------<br>
>>> *From:* Andy Green <andy@warmcat.com><br>
>>> *Sent:* Wednesday, June 14, 2017 6:17 PM<br>
>>> *To:* Ash 20001; libwebsockets@ml.libwebsockets.org<br>
>>> *Subject:* Re: [Libwebsockets] Is there a way to reuse a lws_context <br>
>>> without destroying it<br>
>>> <br>
>>> <br>
>>> On June 15, 2017 9:08:26 AM GMT+08:00, Ash 20001 <ash20001@hotmail.com> <br>
>>> wrote:<br>
>>>>I got the logs with the DEBUG flag on, does this mean the server closed<br>
>>>>the connection?<br>
>>>><br>
>>>>1003 :  2017/6/14 18:05:19.590DBG  :  [5708] lws:<br>
>>>>lws_header_table_attach: wsi 0x7fddf002de00: ah 0x7fddf0009f70: count 1<br>
>>>>(on exit)<br>
>>>>1004 :  2017/6/14 18:05:19.590DBG  :  [5708] lws: lws_client_connect:<br>
>>>>direct conn<br>
>>>>1005 :  2017/6/14 18:05:19.590DBG  :  [5708] lws: lws_client_connect_2<br>
>>>>1006 :  2017/6/14 18:05:19.590DBG  :  [5708] lws: lws_client_connect_2:<br>
>>>>address 105.145.65.86<br>
>>>>1022 :  2017/6/14 18:05:19.593DBG  :  [5708] lws:<br>
>>>>insert_wsi_socket_into_fds: 0x7fddf002de00: tsi=0, sock=14,<br>
>>>>pos-in-fds=2<br>
>>>>1023 :  2017/6/14 18:05:19.593DBG  :  [5708] lws:<br>
>>>>LWS_CALLBACK_WSI_CREATE<br>
>>>>1024 :  2017/6/14 18:05:19.593DBG  :  [5708] lws: nonblocking connect<br>
>>>>retry<br>
>>>>1025 :  2017/6/14 18:05:19.593DBG  :  [5708] lws: wsc loop starting<br>
>>>>1026 :  2017/6/14 18:05:19.593DBG  :  [5708] lws: service_fd: closing<br>
>>>>due to 0 length read<br>
>>> <br>
>>> This is how lws learns the peer closed the connection.<br>
>>> <br>
>>> You can use tcpdump or so to look at the packets that were exchanged if <br>
>>> it's not SSL.<br>
>>> <br>
>>> -Andy<br>
>>> <br>
>>>>1027 :  2017/6/14 18:05:19.593DBG  :  [5708] lws: Close and handled<br>
>>>>1028 :  2017/6/14 18:05:19.593DBG  :  [5708] lws: lws_close_free_wsi:<br>
>>>>shutting down connection: 0x7fddf001f910<br>
>>>>1029 :  2017/6/14 18:05:19.593DBG  :  [5708] lws: service_fd: closing<br>
>>>>due to 0 length read<br>
>>>>1030 :  2017/6/14 18:05:19.593DBG  :  [5708] lws: Close and handled<br>
>>>>1031 :  2017/6/14 18:05:19.593DBG  :  [5708] lws: lws_close_free_wsi:<br>
>>>>real just_kill_connection: 0x7fddf001f910<br>
>>>>1032 :  2017/6/14 18:05:19.593DBG  :  [5708] lws:<br>
>>>>remove_wsi_socket_from_fds: wsi=0x7fddf001f910, sock=13, fds pos=1, end<br>
>>>>guy pos=3, endfd=0<br>
>>>>1033 :  2017/6/14 18:05:19.593DBG  :  [5708] lws: calling back CLOSED<br>
>>>>1034 :  2017/6/14 18:05:19.593DBG  :  [5708] lws: LWS_CALLBACK_CLOSED<br>
>>>><br>
>>>><br>
>>>><br>
>>>><br>
>>>>________________________________<br>
>>>>From: Andy Green <andy@warmcat.com><br>
>>>>Sent: Wednesday, June 14, 2017 3:53 PM<br>
>>>>To: Ash 20001; libwebsockets@ml.libwebsockets.org<br>
>>>>Subject: Re: [Libwebsockets] Is there a way to reuse a lws_context<br>
>>>>without destroying it<br>
>>>><br>
>>>><br>
>>>><br>
>>>>On June 15, 2017 6:45:33 AM GMT+08:00, Ash 20001 <ash20001@hotmail.com><br>
>>>>wrote:<br>
>>>>>1.  you are right, the test-client does handle closed/connection error<br>
>>>>>callbacks, but the code itself does not initiate a disconnect from the<br>
>>>>>server but rather it handles cases where the server dies...not sure if<br>
>>>>>that would make a difference. in my application the client is<br>
>>>>>disconnecting.<br>
>>>><br>
>>>>No test-client also does initiate a disconnect from the server.  The<br>
>>>>connection gets a random 'lifetime' when it is made, after sending that<br>
>>>>many messages it closes the connection and after the ratelimit period<br>
>>>>the outer loop will create a new one.<br>
>>>><br>
>>>>>2.  I can try a later websockets however is there any logging I can<br>
>>>>put<br>
>>>>>into libwebsockets to know why after connection i get a<br>
>>>>callback_closed<br>
>>>>>event after some time randomly? The server is not disconnecting from<br>
>>>>>what I can see.<br>
>>>><br>
>>>>As I said<br>
>>>><br>
>>>>>>In later lws in CONNECTION_ERROR, *in may point to a string<br>
>>>>describing<br>
>>>>>>the problem.<br>
>>>><br>
>>>>If lws did something that failed and initiates the close, there are<br>
>>>>like 20 different reason strings to help debug it.<br>
>>>><br>
>>>>If the peer closes the socket though, 'in' will be NULL.<br>
>>>><br>
>>>>You can turn up the logging to get additional clues, build in DEBUG<br>
>>>>mode at cmake (see README.build.md)  and set the logging level high (eg<br>
>>>>-d 65535 on the test client).<br>
>>>><br>
>>>>-Andy<br>
>>>><br>
>>>>><br>
>>>>><br>
>>>>>________________________________<br>
>>>>>From: Andy Green <andy@warmcat.com><br>
>>>>>Sent: Wednesday, June 14, 2017 3:36 PM<br>
>>>>>To: Ash 20001; libwebsockets@ml.libwebsockets.org<br>
>>>>>Subject: Re: [Libwebsockets] Is there a way to reuse a lws_context<br>
>>>>>without destroying it<br>
>>>>><br>
>>>>><br>
>>>>><br>
>>>>>On June 15, 2017 1:29:46 AM GMT+08:00, Ash 20001<br>
>>>><ash20001@hotmail.com><br>
>>>>>wrote:<br>
>>>>>>sorry i forgot to mention that on reconnect i am connecting to a<br>
>>>>>>different port and potentially even different server ip. Is that why<br>
>>>>>it<br>
>>>>>>won't work with the same context?<br>
>>>>><br>
>>>>>Doubt it, every connect starts fresh.<br>
>>>>><br>
>>>>>>________________________________<br>
>>>>>>From: Ash 20001 <ash20001@hotmail.com><br>
>>>>>>Sent: Wednesday, June 14, 2017 8:47 AM<br>
>>>>>>To: Andy Green<br>
>>>>>>Subject: Re: [Libwebsockets] Is there a way to reuse a lws_context<br>
>>>>>>without destroying it<br>
>>>>>><br>
>>>>>><br>
>>>>>>I am using 1.7 websockets. When I try it again, I start immediately<br>
>>>>><br>
>>>>>1.7 is too old... please see if you still have a problem on master<br>
>>>>lws.<br>
>>>>><br>
>>>>>>getting callback_closed messages after lws_client_connect_via_info is<br>
>>>>>>called. I have no idea why I am getting these messages but if I<br>
>>>>>destroy<br>
>>>>>>the context and then call lws_Create_Context again, it works.<br>
>>>>><br>
>>>>>In later lws in CONNECTION_ERROR, *in may point to a string describing<br>
>>>>>the problem.<br>
>>>>><br>
>>>>>><br>
>>>>>>In libwebsockets-test-client, it doesn't seem to handle callback<br>
>>>>>closed<br>
>>>>>>or callback connection error. Normally during these events I exit out<br>
>>>>><br>
>>>>>It does handle them, or it doesn't know it should retry (mymemory only<br>
>>>>>goesback to v2.0-ish though).<br>
>>>>><br>
>>>>>>of the main lws_Service loop, and then later I try to call<br>
>>>>>>connect_via_info again, restart the service loop, and then run into<br>
>>>>>the<br>
>>>>>>issue above. What should I do to prevent this?<br>
>>>>><br>
>>>>>See if it still happens on later lws.<br>
>>>>><br>
>>>>>>Yes openssl is being trashed and messing around with other threads<br>
>>>>>>using curl to an https source for instance so I am trying to<br>
>>>>>workaround<br>
>>>>>>it because I cannot change the openssl version.<br>
>>>>><br>
>>>>>You're going to have to change something...<br>
>>>>><br>
>>>>>-Andy<br>
>>>>><br>
>>>>>><br>
>>>>>>________________________________<br>
>>>>>>From: Andy Green <andy@warmcat.com><br>
>>>>>>Sent: Wednesday, June 14, 2017 12:29 AM<br>
>>>>>>To: libwebsockets@ml.libwebsockets.org; Ash 20001;<br>
>>>>>>libwebsockets@ml.libwebsockets.org<br>
>>>>>>Subject: Re: [Libwebsockets] Is there a way to reuse a lws_context<br>
>>>>>>without destroying it<br>
>>>>>><br>
>>>>>><br>
>>>>>><br>
>>>>>>On June 14, 2017 2:35:24 PM GMT+08:00, Ash 20001<br>
>>>>><ash20001@hotmail.com><br>
>>>>>>wrote:<br>
>>>>>>>Is there a way to call lws_create_context just once for program<br>
>>>>>>>lifetime as a client, and use that context for many connections (ie.<br>
>>>>>>>connect to a server, disconnect, repeat)? I have tried but it<br>
>>>>doesn't<br>
>>>>>>>seem to work on the second connection.<br>
>>>>>><br>
>>>>>>Yes it should be fine.<br>
>>>>>><br>
>>>>>>Libwebsockets-test-client does exactly this in its normal operation.<br>
>>>>>><br>
>>>>>>What exactly happens (and does it happen on lws master?)<br>
>>>>>><br>
>>>>>>>The reason I ask is because I am having SSL issues with other<br>
>>>>threads<br>
>>>>>>>that I have no control over in a process which use ssl functions in<br>
>>>>>>>CURL. lws_destroy_context globally destructs SSL state and causes<br>
>>>>>>>issues.  My openssl version is rather old 0.9.8 and cannot be<br>
>>>>>changed.<br>
>>>>>><br>
>>>>>>Yeah.... we have seen it before.  Later openssl fixed it.<br>
>>>>>><br>
>>>>>>It will trash openssl for the whole process.  Is that why you can't<br>
>>>>>get<br>
>>>>>>a second client connection in lws?<br>
>>>>>><br>
>>>>>>-Andy<br>
>>>>>><br>
>>>>>>><br>
>>>>>>>Thanks!<br>
>>>>>>><br>
>>>>>>>(Sorry if I sent two emails, not sure if the first one went through<br>
>>>>>>>because I was trying to subscribe to the mailing list).<br>
</div>
</span></font></div>
</div>
</div>
</div>
</div>
</body>
</html>