<div dir="ltr"><span style="font-family:arial,sans-serif;font-size:13px">Hello,</span><div style="font-family:arial,sans-serif;font-size:13px"><br></div><div style="font-family:arial,sans-serif;font-size:13px">Appreciate if you could help. I'm trying to implement a simple Synchronous API wrapping libwebsockets (for client side, not server side), roughly as follows.</div><div style="font-family:arial,sans-serif;font-size:13px"><br></div><div style="font-family:arial,sans-serif;font-size:13px">MYSOCK = Connect(...);</div><div style="font-family:arial,sans-serif;font-size:13px"><br></div><div style="font-family:arial,sans-serif;font-size:13px">STATUS Send(MYSOCK, char* pbData, uint cbData, uint dwFlags);</div><div style="font-family:arial,sans-serif;font-size:13px"><br></div><div style="font-family:arial,sans-serif;font-size:13px"><p class="MsoNormal">STATUS Receive(MYSOCK, char* pbData, uint cbData, uint dwFlags);</p><p class="MsoNormal"><br></p><p class="MsoNormal">Close(MYSOCK);</p><p class="MsoNormal"><br></p><p class="MsoNormal"><br></p><p class="MsoNormal">DO YOU HAVE any ADVICE on HOW to do that most efficiently?</p><p class="MsoNormal"><br></p><p class="MsoNormal"><br></p><p class="MsoNormal">I actually have the following design</p><p class="MsoNormal"><br></p><p class="MsoNormal">A global queue of RecvRequest struct</p><p class="MsoNormal">A global queue of SendRequest struct</p><p class="MsoNormal"><br></p><p class="MsoNormal">Connect():</p><p class="MsoNormal">Create a separate thread</p><p class="MsoNormal">- calling libwebsocket_create_context()</p><p class="MsoNormal">- calling libwebsocket_client_connect()</p><p class="MsoNormal">- running the loop libwebsocket_service()</p><p class="MsoNormal"><br></p><p class="MsoNormal">Close():</p><p class="MsoNormal">Just shutdown the above thread and callings properly</p><p class="MsoNormal"><br></p><p class="MsoNormal">Send():</p><p class="MsoNormal">Add its SendRequest struct to the queue</p><p class="MsoNormal">Call libwebsocket_callback_on_writable()<br></p><p class="MsoNormal">Wait for its event SendRequest.CompleteEvent</p><p class="MsoNormal">return STATUS</p><p class="MsoNormal"><br></p><p class="MsoNormal">Receive():</p><p class="MsoNormal">Add its RecvRequest struct to the queue</p><p class="MsoNormal">Wait for its event RecvRequest.CompleteEvent</p><p class="MsoNormal">return STATUS</p><p class="MsoNormal"><br></p><p class="MsoNormal">CallBack():</p><p class="MsoNormal">case LWS_CALLBACK_CLIENT_WRITEABLE:<br></p><p class="MsoNormal">- Throw the previous SendRequest.CompleteEvent, if there is any.</p><p class="MsoNormal">- Call libwebsocket_write() to send current SendRequest.Data in the queue, if there is any.</p><p class="MsoNormal">- Remove the current SendRequest in the queue to be the "previous" one.</p><p class="MsoNormal">- Call libwebsocket_callback_on_writable()<br></p><p class="MsoNormal">case LWS_CALLBACK_CLIENT_RECEIVE:<br></p><p class="MsoNormal">- Pass received data to RecvRequest.Data in the queue, if there is any.</p><p class="MsoNormal">- Remove the current RecvRequest in the queue.</p><p class="MsoNormal">- Throw the its RecvRequest.CompleteEvent.</p><p class="MsoNormal"><br></p><p class="MsoNormal"><br></p><p class="MsoNormal">DO YOU have any COMMENT on this design?</p><p class="MsoNormal"><br></p><p class="MsoNormal"><br></p><p class="MsoNormal">Many thanks,</p><p class="MsoNormal">Lan</p></div></div>