<div dir="ltr">Dear Andy,<div><br></div><div>In accordance to your advice, I have created a patch to signal lws to break out and reload the poll() when an external thread needs to interact with lws. This is done by sending a filedescriptor to lws on libwebsocket_create_context().</div>

<div><br></div><div>I am novice with lws so please let me know whether it is correct.</div><div><br></div><div>Have a nice christmas,</div><div><br></div><div>Best regards,</div><div>Thomas</div></div><div class="gmail_extra">

<br><br><div class="gmail_quote">2013/12/21 "Andy Green (林安廸)" <span dir="ltr"><<a href="mailto:andy@warmcat.com" target="_blank">andy@warmcat.com</a>></span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

On 21/12/13 10:49, the mail apparently from "Andy Green (林安廸)" included:<div class="im"><br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
On 20/12/13 19:38, the mail apparently from Thomas Spitz included:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Hello Andy,<br>
<br>
In fact, in my application, I mostly often only have 0 to 5 active<br>
connections at the same time with a maximum number of simultaneous<br>
connections restricted to 32 (Besides, why is there no simple solution<br>
to reduce the maximum simultaneous connection? I have seen that we need<br>
to reduce the max system fds...).<br>
</blockquote>
<br>
You should be able to do<br>
<br>
ulimit -n 64<br>
<br>
before starting the server.  It only affects that shell and children. If<br>
you're bothered by the memory footprint of the parent shell, it should<br>
be workable to do an exec instead of running as a child.<br>
<br>
The default is 1024 on most systems... the way we deal with fd lookups<br>
it's just not that expensive to allow 1024 (a few KB).<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Therefore, I think I should implement your following proposal using<br>
External_Poll I guess:<br>
<br>
    Poll can only wait on file or socket descriptors... you could<br>
    reserve a socket to signal to break out and reload the poll()<br>
    because somebody's attribute changed.<br>
</blockquote>
<br>
Actually I was imagining adding it in lws.<br>
</blockquote>
<br></div>
I just pushed a patch<br>
<br>
<a href="http://git.libwebsockets.org/cgi-bin/cgit/libwebsockets/commit/?id=91f19d8d799fdce0459c80357b39930b3ac55a9c" target="_blank">http://git.libwebsockets.org/<u></u>cgi-bin/cgit/libwebsockets/<u></u>commit/?id=<u></u>91f19d8d799fdce0459c80357b3993<u></u>0b3ac55a9c</a><br>


<br>
which should give you a single place to signal all pollfd changes from if you want to have a go at a patch to implement this on lws side.<br>
<br>
If you make a new socket or other descriptor-based thing in the context create code that is open for the lifetime of the client or server, and add it to the pollfs there with POLLIN event set, writing a byte to it from lws_change_pollfd() the first time something changed before the outer loop reloads should do what you want.<span class="HOEnZb"><font color="#888888"><br>


<br>
-Andy<br>
<br>
</font></span><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div class="h5"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">


I tried to do it but my thread is still not able to break out the<br>
poll(). In my test below (using test-server.c as skeletton),  Although I<br>
</blockquote>
<br>
I think it must mean your test is broken.  Otherwise you're saying that<br>
poll() doesn't work.<br>
<br>
-Andy<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
write in the tube that is monitored by poll I see that my asyncSending<br>
is never able to break up poll(). poll() always break up on 10s timeout<br>
whereas my thread write into the tube every second.<br>
<br>
int tube[2];<br>
<br>
(...)<br>
<br>
void *asyncSending(void *arg) {<br>
<br>
unsigned char c=0;<br>
printf("START asynchronous sending\n");<br>
<br>
while(1){<br>
c++;<br>
printf("write in tube\n");<br>
if(write(tube[1],&c,1)!=1){<br>
printf("Erreur write %s\n", strerror(errno));<br>
}<br>
//libwebsocket_callback_on_<u></u>writable_all_protocol(&<u></u>protocols[PROTOCOL_DUMB_<u></u>INCREMENT]);<br>
<br>
}<br>
<br>
printf("END asynchronous sending\n");<br>
return NULL ;<br>
<br>
}<br>
<br>
<br>
  int main(int argc, char **argv) {<br>
<br>
         (...)<br>
<br>
n = 0;<br>
<br>
printf("Tube creation\n");<br>
if(pipe(tube)!=0){<br>
printf("Pipe creation error %s\n", strerror(errno));<br>
}<br>
<br>
if (count_pollfds >= max_poll_elements) {<br>
lwsl_err("LWS_CALLBACK_ADD_<u></u>POLL_FD: too many sockets to track\n");<br>
return 1;<br>
}<br>
<br>
fd_lookup[tube[0]] = count_pollfds;<br>
pollfds[count_pollfds].fd = fd_lookup[tube[0]];<br>
pollfds[count_pollfds].events = POLLIN | POLLPRI |POLL_OUT;<br>
pollfds[count_pollfds++].<u></u>revents = 0;<br>
<br>
int statut_Thread;<br>
pthread_t Thread;<br>
<br>
statut_Thread = pthread_create(&Thread, NULL, asyncSending, context);<br>
if (statut_Thread != 0) {<br>
printf("Thread creation errror \n");<br>
}<br>
<br>
while (n >= 0 && !force_exit) {<br>
<br>
/*<br>
* this represents an existing server's single poll action<br>
* which also includes libwebsocket sockets<br>
*/<br>
<br>
n = poll(pollfds, count_pollfds, 10000);//10s<br>
if (n < 0)<br>
continue;<br>
<br>
if (n)<br>
for (n = 0; n < count_pollfds; n++)<br>
if (pollfds[n].revents)<br>
/*<br>
* returns immediately if the fd does not<br>
* match anything under libwebsockets<br>
* control<br>
*/<br>
if (libwebsocket_service_fd(<u></u>context,<br>
&pollfds[n]) < 0)<br>
goto done;<br>
<br>
                (...)<br>
        }<br>
}<br>
<br>
Thanks again in advance for your help.<br>
<br>
BR, Thomas<br>
<br>
<br>
2013/12/19 "Andy Green (林安廸)" <<a href="mailto:andy@warmcat.com" target="_blank">andy@warmcat.com</a><br>
<mailto:<a href="mailto:andy@warmcat.com" target="_blank">andy@warmcat.com</a>>><br>
<br>
    On 19/12/13 02:12, the mail apparently from Thomas Spitz included:<br>
<br>
        Hello Andy, hello Eugene,<br>
<br>
        If I understood it correctly, thanks to your patch, we can now<br>
        prevent<br>
        our external thread(s) from calling<br>
        libwebsocket_callback_on___<u></u>writable<br>
        while lws is actively dealing with POLLIN and POLLOUT of fds<br>
        using our<br>
        own mutex? Thus we are sure that the request(s) from our external<br>
        thread(s) will not be lost, or at least trigger<br>
        a LWS_CALLBACK_SERVER_WRITEABLE?<br>
<br>
<br>
    I'm not sure it won't get lost, but it won't leave things in an<br>
    indeterminate state.  It can still happen the non-service thread<br>
    asks to set POLLOUT just as we're about to take the mutex and<br>
clear it.<br>
<br>
    At the moment that'll still break at low probability but it should<br>
    be solveable.<br>
<br>
<br>
        My second question is related to performance:<br>
<br>
        In the documentation it is said<br>
<br>
             If you want to send something, do not just send it but<br>
        request a<br>
             callback |when the socket is writeable |<br>
<br>
        That is why our external thread call<br>
        libwebsocket_callback_on___<u></u>writable<br>
        (). Then it is written<br>
<br>
             |Usually you will get called back immediately next time<br>
        around the<br>
             service loop|<br>
<br>
        which seems to mean that  (according to my tests) we have to<br>
        wait libwebsocket_service() to end up before the socket is<br>
writeable<br>
        again. That implies to set a very short timeout<br>
<br>
<br>
    Well... you are right if we have one connection.  But if you have 50<br>
    or 50,000 connections, somebody almost always has something going on<br>
    before the timeout.<br>
<br>
    Also in your user callback, you can take the approach like in the<br>
    test apps to loop using lws_send_pipe_choked() test to absolutely<br>
    stuff your pipe each time you get service.  That doesn't delay<br>
    anything looping there because it only loops while the send won't<br>
    block.  And it means the kernel is passing out what you stuffed into<br>
    the pipe while you wait through any latency in the next "writeable"<br>
    service.<br>
<br>
<br>
        for libwebsocket_service(context, VERYSHORTTIMEOUT) otherwise it<br>
        will<br>
        take a long time before the external thread request could be<br>
        handled...<br>
        This brings me to wonder why it is not possible to loop on<br>
        libwebsocket_service(context, VERYLONGTIMEOUT) that would be<br>
        interrupted<br>
        by our external thread instead? Thus lws thread is asleeped most<br>
        of the<br>
        time when there is no incoming IP traffic but can be awaken as<br>
        soon as<br>
        some outgoing traffic needs to be sent (generated from the<br>
        external thread).<br>
<br>
<br>
    Well lws is a singlethreaded nonblocking implementation.  It is<br>
    designed to run on small resource-costrained platforms at the same<br>
    time a being able to service huge numbers of connections in a<br>
    lightweight way.  It does not require threads.<br>
<br>
    Poll can only wait on file or socket descriptors... you could<br>
    reserve a socket to signal to break out and reload the poll()<br>
    because somebody's attribute changed.  But in most real usage<br>
    scenarios, some other connection is always wanting service before<br>
    the timeout anyway and as more connections are seen the less it<br>
    matters about latency from waiting for poll() reload.<br>
<br>
    -Andy<br>
<br>
        I hope my two questions are clear..<br>
<br>
        Thanks in advance for your rely.<br>
<br>
        Best regards, Thomas<br>
<br>
        2013/12/18 "Andy Green (林安廸)" <<a href="mailto:andy@warmcat.com" target="_blank">andy@warmcat.com</a><br>
        <mailto:<a href="mailto:andy@warmcat.com" target="_blank">andy@warmcat.com</a>><br>
        <mailto:<a href="mailto:andy@warmcat.com" target="_blank">andy@warmcat.com</a> <mailto:<a href="mailto:andy@warmcat.com" target="_blank">andy@warmcat.com</a>>>><br>
<br>
<br>
             On 18/12/13 06:40, the mail apparently from Andy Green<br>
        included:<br>
<br>
<br>
<br>
                 Eugene Agafonov <<a href="mailto:e.a.agafonov@gmail.com" target="_blank">e.a.agafonov@gmail.com</a><br>
        <mailto:<a href="mailto:e.a.agafonov@gmail.com" target="_blank">e.a.agafonov@gmail.com</a><u></u>><br>
                 <mailto:<a href="mailto:e.a.agafonov@gmail.com" target="_blank">e.a.agafonov@gmail.com</a><br>
        <mailto:<a href="mailto:e.a.agafonov@gmail.com" target="_blank">e.a.agafonov@gmail.com</a><u></u>>__>> wrote:<br>
<br>
                     Hi!<br>
<br>
                     I've just implemented the similar scenario just<br>
        like it is<br>
                     stated<br>
                     in document<br>
<br>
<a href="http://git.libwebsockets.org/____cgi-bin/cgit/libwebsockets/____tree/README.coding" target="_blank">http://git.libwebsockets.org/_<u></u>___cgi-bin/cgit/libwebsockets/<u></u>____tree/README.coding</a><br>
<br>
<br>
<<a href="http://git.libwebsockets.org/__cgi-bin/cgit/libwebsockets/__tree/README.coding" target="_blank">http://git.libwebsockets.org/<u></u>__cgi-bin/cgit/libwebsockets/_<u></u>_tree/README.coding</a>><br>
<br>
<br>
<br>
<br>
<<a href="http://git.libwebsockets.org/__cgi-bin/cgit/libwebsockets/__tree/README.coding" target="_blank">http://git.libwebsockets.org/<u></u>__cgi-bin/cgit/libwebsockets/_<u></u>_tree/README.coding</a><br>
<br>
<br>
<<a href="http://git.libwebsockets.org/cgi-bin/cgit/libwebsockets/tree/README.coding" target="_blank">http://git.libwebsockets.org/<u></u>cgi-bin/cgit/libwebsockets/<u></u>tree/README.coding</a>>><br>
<br>
<br>
<br>
<br>
             I have a mutex-protected queue of outgoing events (as a<br>
        std::list of<br>
<br>
                     strings). Each string is intended to be send in<br>
        separated<br>
                     message.<br>
<br>
                     The writer thread posts data onto queue and calls<br>
                     libwebsocket_callback_on_____<u></u>writable(context, wsi)<br>
<br>
<br>
                     Protocol callback gets<br>
        LWS_CALLBACK_SERVER_WRITEABLE as soon as<br>
                     websocket thread is ready to send data. Once it<br>
        comes, the<br>
                     callback<br>
                     extracts strings from the queue one by one and<br>
        writes them to<br>
                     socket using libwebsocket_write.<br>
<br>
                     I'm quite newby in writing WS server with<br>
        libwebsockets. Any<br>
                     comments from WS gurus are welcome<br>
<br>
<br>
                 What you're doing is a good way to interact with what<br>
        lws needs and<br>
                 get what you want from threading.<br>
<br>
                 There's one danger with it, but that is a very tightly<br>
        defined race<br>
                 rather than corruption or whatever.<br>
<br>
<br>
             Well... there's another thing to take care about... you<br>
need to<br>
             manage your private list of live wsis carefully.  It means<br>
        managing<br>
             that list (with any of your locking needed) at the<br>
        ESTABLISHED /<br>
             CLOSED callback for the WSI.  That should be enough I think.<br>
<br>
<br>
                 The issue is that the 'wait for writeable' is oneshot,<br>
        so after it<br>
                 becomes true in the poll lws will clear the POLLOUT<br>
        wait flag.  But<br>
                 because the threads are asynchronous, eventually the<br>
        other thread<br>
                 will come at the wrong time and set it just as we're<br>
        clearing it<br>
                 with<br>
                 indeterminate results.  Because it's read-modify-write<br>
        and flow<br>
                 control code also modifies this, there's a low<br>
        probability deadlock<br>
                 case where POLLIN or POLLOUT from one thread or another<br>
        did not get<br>
                 set for wait as the thread thinks it is.<br>
<br>
                 If the extpoll stuff is used the issue can be worse<br>
        depending on<br>
                 what<br>
                 it is doing.<br>
<br>
                 However the approach you're taking is otherwise really<br>
        workable I<br>
                 think.  To make it rock solid you'll need to patch<br>
lws to<br>
                 mutex-protect the few places it changes poll wait flags.<br>
<br>
<br>
             I added a patch<br>
<br>
<br>
<a href="http://git.libwebsockets.org/____cgi-bin/cgit/libwebsockets/____commit/?id=____7a1327977ac10bdbace0012274b8ae____889219880e" target="_blank">http://git.libwebsockets.org/_<u></u>___cgi-bin/cgit/libwebsockets/<u></u>____commit/?id=____<u></u>7a1327977ac10bdbace0012274b8ae<u></u>____889219880e</a><br>


<br>
<br>
<<a href="http://git.libwebsockets.org/__cgi-bin/cgit/libwebsockets/__commit/?id=__7a1327977ac10bdbace0012274b8ae__889219880e" target="_blank">http://git.libwebsockets.org/<u></u>__cgi-bin/cgit/libwebsockets/_<u></u>_commit/?id=__<u></u>7a1327977ac10bdbace0012274b8ae<u></u>__889219880e</a>><br>


<br>
<br>
<br>
<br>
<<a href="http://git.libwebsockets.org/__cgi-bin/cgit/libwebsockets/__commit/?id=__7a1327977ac10bdbace0012274b8ae__889219880e" target="_blank">http://git.libwebsockets.org/<u></u>__cgi-bin/cgit/libwebsockets/_<u></u>_commit/?id=__<u></u>7a1327977ac10bdbace0012274b8ae<u></u>__889219880e</a><br>


<br>
<br>
<<a href="http://git.libwebsockets.org/cgi-bin/cgit/libwebsockets/commit/?id=7a1327977ac10bdbace0012274b8ae889219880e" target="_blank">http://git.libwebsockets.org/<u></u>cgi-bin/cgit/libwebsockets/<u></u>commit/?id=<u></u>7a1327977ac10bdbace0012274b8ae<u></u>889219880e</a>>><br>


<br>
<br>
             that lets you do this in a lock and unlock callback in<br>
the user<br>
             code, in one place.<br>
<br>
             If you're not using threading you don't need to do anything<br>
        new.<br>
<br>
             -Andy<br>
<br>
<br>
                 -Andy<br>
<br>
                     BR, Eugene Agafonov.<br>
<br>
                     On Tuesday 17 December 2013 12:03:43 Thomas Spitz<br>
        wrote:<br>
<br>
                         Hello everyone,<br>
<br>
                         I am trying to find a way for external threads<br>
        to ask<br>
                         libwebsocket<br>
<br>
                     server<br>
<br>
                         to send websocket message on their behalf (as<br>
they<br>
                         cannot do it<br>
<br>
                     directly).<br>
<br>
                         The only way I see at the present is to make a<br>
        loop with<br>
                         libwebsocket_service (context, VERYSHORTTIME);<br>
        and test<br>
                         potential<br>
<br>
                     incoming<br>
<br>
                         messages from other threads. This is not very<br>
        elegant as CPU<br>
                         computes<br>
<br>
                     all<br>
<br>
                         the time and not very reliable as I should put<br>
                         VERYSHORTTIME at 0<br>
                         if<br>
<br>
                     I<br>
<br>
                         don't want to miss any message.<br>
<br>
                         I tried the following modification in<br>
        test-server.c :<br>
<br>
                         void *connexionServeur(void *arg) {<br>
<br>
                             struct libwebsocket_context *context = arg;<br>
        while (1) {<br>
                             if(libwebsocket_service(____<u></u>context,<br>
60000)<0){<br>
<br>
<br>
                             printf("Problem!\n");<br>
<br>
                             break; } }<br>
<br>
                             return NULL ;<br>
<br>
                             } int statut_Thread; pthread_t Thread;<br>
        statut_Thread =<br>
                             pthread_create(&Thread, NULL,<br>
connexionServeur,<br>
<br>
                     context<br>
<br>
                             );<br>
<br>
                             if (statut_Thread != 0) {<br>
<br>
                             printf("Problem with thread creation \n");<br>
        } while<br>
                             (n >= 0 &&<br>
                             !force_exit) { struct timeval tv;<br>
        gettimeofday(&tv,<br>
                             NULL); if<br>
                             (((unsigned int)tv.tv_usec - oldus) ><br>
50000) {<br>
<br>
<br>
<br>
<br>
libwebsocket_callback_on_____<u></u>writable_all_protocol(&____<u></u>protocols[PROTOCOL_DUMB_I<br>
<br>
<br>
<br>
<br>
<br>
             NCREMENT]); oldus = tv.tv_usec;<br>
<br>
                             libwebsocket_service(context, 0);<br>
<br>
                             }<br>
<br>
                             usleep(10000); }<br>
<br>
<br>
                         but it crashes quickly as soon as I try<br>
drawing . I<br>
                         suppose that<br>
                         libwebsocket_service is called twice at the<br>
        same time and it<br>
                         creates conflicts that lead to stop crash the<br>
        websocket.<br>
<br>
                         I have seen in the mailing list that Thomas<br>
        Koeper has<br>
                         already<br>
                         had a similar question<br>
<br>
<br>
<a href="http://ml.libwebsockets.org/____pipermail/libwebsockets/2013-____April/000403.html" target="_blank">http://ml.libwebsockets.org/__<u></u>__pipermail/libwebsockets/<u></u>2013-____April/000403.html</a><br>
<br>
<br>
<<a href="http://ml.libwebsockets.org/__pipermail/libwebsockets/2013-__April/000403.html" target="_blank">http://ml.libwebsockets.org/_<u></u>_pipermail/libwebsockets/2013-<u></u>__April/000403.html</a>><br>
<br>
<br>
<br>
<br>
<<a href="http://ml.libwebsockets.org/__pipermail/libwebsockets/2013-__April/000403.html" target="_blank">http://ml.libwebsockets.org/_<u></u>_pipermail/libwebsockets/2013-<u></u>__April/000403.html</a><br>
<br>
<br>
<<a href="http://ml.libwebsockets.org/pipermail/libwebsockets/2013-April/000403.html" target="_blank">http://ml.libwebsockets.org/<u></u>pipermail/libwebsockets/2013-<u></u>April/000403.html</a>>><br>
<br>
<br>
<br>
<br>
             . At that time, he was thinking of creating a mutex on<br>
<br>
                         libwebsocket_service. Do you think this is the<br>
        right<br>
                         solution?<br>
<br>
                         Thanks in advance for your help Best regards,<br>
        Thomas<br>
<br>
                     ______________________________<u></u>_____________________<br>
        Libwebsockets<br>
                     mailing list Libwebsockets@ml.__<a href="http://libwebsocke__ts.org" target="_blank">libwebsocke<u></u>__ts.org</a><br>
        <<a href="http://libwebsockets.org" target="_blank">http://libwebsockets.org</a>><br>
                     <mailto:<a href="mailto:Libwebsockets@ml." target="_blank">Libwebsockets@ml.</a>__<a href="http://libwebsockets.org" target="_blank">lib<u></u>websockets.org</a><br>
        <mailto:<a href="mailto:Libwebsockets@ml.libwebsockets.org" target="_blank">Libwebsockets@ml.<u></u>libwebsockets.org</a>>><br>
        <a href="http://ml.libwebsockets.org/____mailman/listinfo/libwebsockets" target="_blank">http://ml.libwebsockets.org/__<u></u>__mailman/listinfo/<u></u>libwebsockets</a><br>
        <<a href="http://ml.libwebsockets.org/__mailman/listinfo/libwebsockets" target="_blank">http://ml.libwebsockets.org/_<u></u>_mailman/listinfo/<u></u>libwebsockets</a>><br>
<br>
        <<a href="http://ml.libwebsockets.org/__mailman/listinfo/libwebsockets" target="_blank">http://ml.libwebsockets.org/_<u></u>_mailman/listinfo/<u></u>libwebsockets</a><br>
        <<a href="http://ml.libwebsockets.org/mailman/listinfo/libwebsockets" target="_blank">http://ml.libwebsockets.org/<u></u>mailman/listinfo/libwebsockets</a><u></u>>__><br>
<br>
<br>
                 ______________________________<u></u>_____________________<br>
        Libwebsockets<br>
                 mailing<br>
                 list Libwebsockets@ml.__<a href="http://libwebsocke__ts.org" target="_blank">libwebsocke<u></u>__ts.org</a><br>
        <<a href="http://libwebsockets.org" target="_blank">http://libwebsockets.org</a>><br>
                 <mailto:<a href="mailto:Libwebsockets@ml." target="_blank">Libwebsockets@ml.</a>__<a href="http://libwebsockets.org" target="_blank">lib<u></u>websockets.org</a><br>
        <mailto:<a href="mailto:Libwebsockets@ml.libwebsockets.org" target="_blank">Libwebsockets@ml.<u></u>libwebsockets.org</a>>><br>
        <a href="http://ml.libwebsockets.org/____mailman/listinfo/libwebsockets" target="_blank">http://ml.libwebsockets.org/__<u></u>__mailman/listinfo/<u></u>libwebsockets</a><br>
        <<a href="http://ml.libwebsockets.org/__mailman/listinfo/libwebsockets" target="_blank">http://ml.libwebsockets.org/_<u></u>_mailman/listinfo/<u></u>libwebsockets</a>><br>
<br>
        <<a href="http://ml.libwebsockets.org/__mailman/listinfo/libwebsockets" target="_blank">http://ml.libwebsockets.org/_<u></u>_mailman/listinfo/<u></u>libwebsockets</a><br>
        <<a href="http://ml.libwebsockets.org/mailman/listinfo/libwebsockets" target="_blank">http://ml.libwebsockets.org/<u></u>mailman/listinfo/libwebsockets</a><u></u>>__><br>
<br>
<br>
             ______________________________<u></u>_____________________<br>
             Libwebsockets mailing list<br>
             Libwebsockets@ml.__<a href="http://libwebsocke__ts.org" target="_blank">libwebsocke<u></u>__ts.org</a><br>
        <<a href="http://libwebsockets.org" target="_blank">http://libwebsockets.org</a>><br>
             <mailto:<a href="mailto:Libwebsockets@ml." target="_blank">Libwebsockets@ml.</a>__<a href="http://libwebsockets.org" target="_blank">lib<u></u>websockets.org</a><br>
        <mailto:<a href="mailto:Libwebsockets@ml.libwebsockets.org" target="_blank">Libwebsockets@ml.<u></u>libwebsockets.org</a>>><br>
        <a href="http://ml.libwebsockets.org/____mailman/listinfo/libwebsockets" target="_blank">http://ml.libwebsockets.org/__<u></u>__mailman/listinfo/<u></u>libwebsockets</a><br>
        <<a href="http://ml.libwebsockets.org/__mailman/listinfo/libwebsockets" target="_blank">http://ml.libwebsockets.org/_<u></u>_mailman/listinfo/<u></u>libwebsockets</a>><br>
<br>
        <<a href="http://ml.libwebsockets.org/__mailman/listinfo/libwebsockets" target="_blank">http://ml.libwebsockets.org/_<u></u>_mailman/listinfo/<u></u>libwebsockets</a><br>
        <<a href="http://ml.libwebsockets.org/mailman/listinfo/libwebsockets" target="_blank">http://ml.libwebsockets.org/<u></u>mailman/listinfo/libwebsockets</a><u></u>>__><br>
<br>
<br>
<br>
</blockquote>
<br></div></div><div class="im">
______________________________<u></u>_________________<br>
Libwebsockets mailing list<br>
<a href="mailto:Libwebsockets@ml.libwebsockets.org" target="_blank">Libwebsockets@ml.<u></u>libwebsockets.org</a><br>
<a href="http://ml.libwebsockets.org/mailman/listinfo/libwebsockets" target="_blank">http://ml.libwebsockets.org/<u></u>mailman/listinfo/libwebsockets</a><br>
</div></blockquote>
<br>
</blockquote></div><br></div>