<div dir="ltr">Some things I'm still not clear about:<div><br><div>1.</div><div><span class="im" style="font-family:arial,sans-serif;font-size:13px">>case LWS_CALLBACK_CLIENT_WRITEABLE:<br>><br>>- Throw the previous SendRequest.CompleteEvent, if there is any.<br>><br>>- Call libwebsocket_write() to send current SendRequest.Data in the<br>>queue,<br>>if there is any.<br>><br>>- Remove the current SendRequest in the queue to be the "previous" one.<br>><br>>- Call libwebsocket_callback_on_writable()<br><br></span><span style="font-family:arial,sans-serif;font-size:13px">A> You would only do the last bit if there was more to send on that connection already.</span><br style="font-family:arial,sans-serif;font-size:13px"><br style="font-family:arial,sans-serif;font-size:13px"><span style="font-family:arial,sans-serif;font-size:13px">A> Otherwise you would just return 0 and let it go quiet there until the other thread saw something came for that connection to deal with.</span><br style="font-family:arial,sans-serif;font-size:13px"></div><div><span style="font-family:arial,sans-serif;font-size:13px"><br></span></div><div>I need to notify the Send() call that <span style="color:rgb(80,0,80);font-family:arial,sans-serif;font-size:13px">libwebsocket_write() has completed successfully so that the Send() stops blocking and returns successfully. How do I know when </span><span style="color:rgb(80,0,80);font-family:arial,sans-serif;font-size:13px">libwebsocket_write() has completed successfully, to throw SendRequest.CompleteEvent for that Send()?</span></div><div><span style="color:rgb(80,0,80);font-family:arial,sans-serif;font-size:13px"><br></span></div><div><span style="color:rgb(80,0,80);font-family:arial,sans-serif;font-size:13px"><br></span></div><div><span style="font-family:arial,sans-serif;font-size:13px">A> You either have to deal with keeping your own list of active wsi, in order to have the right wsi for the data when you call libwebsocket_callback_on_</span><span style="font-family:arial,sans-serif;font-size:13px">writable(), or call ..._all_protocol() from the other thread if that is what your app is doing.</span><br style="font-family:arial,sans-serif;font-size:13px"><br style="font-family:arial,sans-serif;font-size:13px"><span style="font-family:arial,sans-serif;font-size:13px">A> You can hook ESTABLISHED and CLOSE callbacks to maintain your own wsi list if that's what you need.</span><br style="font-family:arial,sans-serif;font-size:13px"></div><div><span style="color:rgb(80,0,80);font-family:arial,sans-serif;font-size:13px"><br></span></div><div>I thought there is only 1 wsi returned from <span style="color:rgb(80,0,80);font-family:arial,sans-serif;font-size:13px">libwebsocket_client_connect() (just called once in Connect()) to pass around. Could you please explain this a bit?</span></div><div><span style="color:rgb(80,0,80);font-family:arial,sans-serif;font-size:13px"><br></span></div><div><br></div><div><font color="#500050" face="arial, sans-serif">Many thanks,</font></div><div><font color="#500050" face="arial, sans-serif">Lan</font></div><div><span style="font-family:arial,sans-serif;font-size:13px"><br></span></div><div><span style="font-family:arial,sans-serif;font-size:13px"><br></span></div><div><span style="font-family:arial,sans-serif;font-size:13px"><br></span></div></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Sat, Nov 8, 2014 at 5:22 PM, Andy Green <span dir="ltr"><<a href="mailto:andy@warmcat.com" target="_blank">andy@warmcat.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class=""><br>
<br>
On 9 November 2014 07:55:07 GMT+08:00, Duy Lan Nguyen <<a href="mailto:ndlan2k@gmail.com">ndlan2k@gmail.com</a>> wrote:<br>
>Hello,<br>
><br>
>Appreciate if you could help. I'm trying to implement a simple<br>
>Synchronous<br>
>API wrapping libwebsockets (for client side, not server side), roughly<br>
>as<br>
>follows.<br>
><br>
>MYSOCK = Connect(...);<br>
><br>
>STATUS Send(MYSOCK, char* pbData, uint cbData, uint dwFlags);<br>
><br>
>STATUS Receive(MYSOCK, char* pbData, uint cbData, uint dwFlags);<br>
><br>
><br>
>Close(MYSOCK);<br>
<br>
</span>Well, okay.  That's not the idea of lws I guess you already know.<br>
<span class=""><br>
>DO YOU HAVE any ADVICE on HOW to do that most efficiently?<br>
><br>
><br>
><br>
>I actually have the following design<br>
><br>
><br>
>A global queue of RecvRequest struct<br>
><br>
>A global queue of SendRequest struct<br>
><br>
><br>
>Connect():<br>
><br>
>Create a separate thread<br>
><br>
>- calling libwebsocket_create_context()<br>
><br>
>- calling libwebsocket_client_connect()<br>
><br>
>- running the loop libwebsocket_service()<br>
<br>
</span>OK.<br>
<span class=""><br>
>Close():<br>
><br>
>Just shutdown the above thread and callings properly<br>
><br>
><br>
>Send():<br>
><br>
>Add its SendRequest struct to the queue<br>
><br>
>Call libwebsocket_callback_on_writable()<br>
><br>
>Wait for its event SendRequest.CompleteEvent<br>
><br>
>return STATUS<br>
><br>
><br>
>Receive():<br>
><br>
>Add its RecvRequest struct to the queue<br>
><br>
>Wait for its event RecvRequest.CompleteEvent<br>
><br>
>return STATUS<br>
><br>
><br>
>CallBack():<br>
><br>
>case LWS_CALLBACK_CLIENT_WRITEABLE:<br>
><br>
>- Throw the previous SendRequest.CompleteEvent, if there is any.<br>
><br>
>- Call libwebsocket_write() to send current SendRequest.Data in the<br>
>queue,<br>
>if there is any.<br>
><br>
>- Remove the current SendRequest in the queue to be the "previous" one.<br>
><br>
>- Call libwebsocket_callback_on_writable()<br>
<br>
</span>You would only do the last bit if there was more to send on that connection already.<br>
<br>
Otherwise you would just return 0 and let it go quiet there until the other thread saw something came for that connection to deal with.<br>
<span class=""><br>
>case LWS_CALLBACK_CLIENT_RECEIVE:<br>
><br>
>- Pass received data to RecvRequest.Data in the queue, if there is any.<br>
><br>
>- Remove the current RecvRequest in the queue.<br>
><br>
>- Throw the its RecvRequest.CompleteEvent.<br>
><br>
><br>
><br>
>DO YOU have any COMMENT on this design?<br>
<br>
</span>You either have to deal with keeping your own list of active wsi, in order to have the right wsi for the data when you call libwebsocket_callback_on_writable(), or call ..._all_protocol() from the other thread if that is what your app is doing.<br>
<br>
You can hook ESTABLISHED and CLOSE callbacks to maintain your own wsi list if that's what you need.<br>
<br>
Basically your design should be OK for lws, you're only writing from the service thread in the writable callback, and from the other thread you only do the on_writable() call, these are the key things to get a good result if there's more than one thread or process involved.<br>
<br>
-Andy<br>
<br>
><br>
><br>
>Many thanks,<br>
><br>
>Lan<br>
><br>
><br>
>------------------------------------------------------------------------<br>
><br>
>_______________________________________________<br>
>Libwebsockets mailing list<br>
><a href="mailto:Libwebsockets@ml.libwebsockets.org">Libwebsockets@ml.libwebsockets.org</a><br>
><a href="http://ml.libwebsockets.org/mailman/listinfo/libwebsockets" target="_blank">http://ml.libwebsockets.org/mailman/listinfo/libwebsockets</a><br>
<br>
</blockquote></div><br></div>