<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>I tried to reproduce it with libwebsocket-test-server and test-client with 2 servers on separate ports but could not with the example.</p>
<p><br>
</p>
<p>In my application I have been able to reproduce it on the same port itself and when I reconnected using the same context I see this:</p>
<p><br>
</p>
<p></p>
<div>140  :  2017/6/15 12:53:09.397DBG  :  [26988] lws: insert_wsi_socket_into_fds: 0x7f5c2c01fa40: tsi=0, sock=13, pos-in-fds=1</div>
<div>sigReconnectHandler: caught signal 3... reconnecting</div>
<div>477  :  2017/6/15 12:53:24.708DBG  :  [27038] lws: insert_wsi_socket_into_fds: 0x7f5c2c01fbe0: tsi=0, sock=14, pos-in-fds=2</div>
<div>sigReconnectHandler: caught signal 3... reconnecting</div>
<div>627  :  2017/6/15 12:53:31.352DBG  :  [27074] lws: insert_wsi_socket_into_fds: 0x7f5c2400fe20: tsi=0, sock=13, pos-in-fds=2</div>
<div>sigReconnectHandler: caught signal 3... reconnecting</div>
<div>1115 :  2017/6/15 12:53:37.216DBG  :  [27109] lws: insert_wsi_socket_into_fds: 0x7f5c24000e90: tsi=0, sock=15, pos-in-fds=3</div>
<div>sigReconnectHandler: caught signal 3... reconnecting</div>
<div>1270 :  2017/6/15 12:53:42.761DBG  :  [27145] lws: insert_wsi_socket_into_fds: 0x7f5c1c0014a0: tsi=0, sock=13, pos-in-fds=3</div>
<div>sigReconnectHandler: caught signal 3... reconnecting</div>
<div>1783 :  2017/6/15 12:53:48.660DBG  :  [27181] lws: insert_wsi_socket_into_fds: 0x7f5c1c002700: tsi=0, sock=16, pos-in-fds=4</div>
<div>1926 :  2017/6/15 12:53:52.921DBG  :  [27209] lws: insert_wsi_socket_into_fds: 0x7f5c1c000ca0: tsi=0, sock=13, pos-in-fds=4</div>
<div>sigReconnectHandler: caught signal 3... reconnecting</div>
<div>2411 :  2017/6/15 12:53:54.316DBG  :  [27241] lws: insert_wsi_socket_into_fds: 0x7f5c1c001350: tsi=0, sock=17, pos-in-fds=5</div>
<div><br>
</div>
To me that means that sockets aren't getting cleaned up. In addition I have found cases in wireshark when after I have connected with one port, another SYN starts from a different port within the libwebsockets code. I don't understand this. 
<p></p>
<p><br>
</p>
<p>One question I have is that if I reconnect using the same context on a different thread each time, would that cause problems?</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 1:39 AM<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/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>
</body>
</html>