10 ms·
Libwebsockets: pure C library for http, websockets, MQTT
- seansh 3y agoMain website: https://libwebsockets.org/ https://libwebsockets.org/
- renewiltord 3y agoHas anyone bridged this to Java with JNI and used it well for a HTTP/2 client? Considering doing this some time within the next month but if someone already has done work would be useful to see. Response to below user since rate limited: Few Java libraries support everything required. At the socket level if you want to get cmsg struct information you’re not going to get that from most Java libraries and you need that configurable since sometimes you use SO_TIMESTAMP et al. and other times you don’t and if you use SW for that you can lose a few hundred micros there. OTOH libwebsockets very easy to modify. Downside is it manages the loop. So you need to do some engineering. But if someone has already learned the lessons there it would be helpful to me. If they haven’t, I’ll just do it I suppose.
- jansommer 3y agoNot a Java developer, but why not use an existing Java library for this? Don't know if they're using C or something else behind the scenes, but a quick Google search brings up a few.
- sumeruchat 3y agoWell because in java you wont be able to do low level stuff like managing individual memory blocks that is essential in a websockets networking lib.
- ianlevesque 3y agoThis is just false with NIO buffers. There’s a large corpus of Netty-based servers and clients for all sorts of binary protocols.
- rad_gruchalski 3y agoI wonder how other websockets libraries for java do it if it is impossible /s
- rockwotj 3y agoLook at Netty.io, that's the defecto java networking library. They have some optional JNI stuff
- deleted 3y ago[deleted]
- muragekibicho 3y agoAmazing library! Super simple and well maintained
- gary_0 3y agoAny thoughts on how it compares to libcurl?
- ncann 3y agoAs far as I can tell, libcurl's support for websocket is fairly minimal with the main use case being "connect to this ws endpoint and send/receive data". Meanwhile libwebsockets allows you to do everything under the sun that you can think of with ws
- qwertox 3y agoThis is what the Mosquitto MQTT broker is using to offer Websocket support. Interesting to see that this has a MQTT client integrated.
- adamzegelin 3y agoHTTP, websockets, MQTT, ... plus the kitchen sink it seems: - JSON parsing - DNS, DHCP and NTP clients - SOCKS5 proxy support - DBUS client and server - Threadpools - SSH - JPEG and PNG decoding - HTML and CSS parsing - DOM layout and rendering to a frame buffer - OTA update client - GPIO, i2c, PWM, SPI - SSH server - ACME client - ...
- deleted 3y ago[deleted]
- janice1999 3y agoIs this a joke? On first glance the project looks like a library for serving and consuming HTTP(s)/Web sockets. Everything else you mention appears to be optional integrations, like SSH, or separate examples provided by the developers in other repos to showcase diverse usecases, like the ESP32 applications.
- adamzegelin 3y agoMy comment was suggesting that it's more than just a "lightweight" HTTP/websockets/MQTT library. The majority of the things I list are optional features of the core library (rather than examples) enabled by cmake flags, some of which look to be enabled by default: option(LWS_WITH_JPEG "Enable stateful JPEG stream decoder" ON) I would be slightly surprised if I saw a dependency on "libwebsockets" and found that it brought in a JPEG decoder, for example. All these extra features may imply that it's grown past its original goals, and that the other bits and pieces could be split into smaller parts, etc.
- wokwokwok 3y agoThis is just the endemic result of C++ lacking a package manager. Every library starts out small, adds its own vendored utilities, adds its own dependencies, and eventually becomes boost. To be fair to this project, theyve worked quite hard to make the library consumable by others… but yes, its hard to look at the code like https://github.com/warmcat/libwebsockets/blob/50ba61082dc40bb5041e25031ef364a3628417ab/lib/roles/http/server/server.c#L680 https://github.com/warmcat/libwebsockets/blob/50ba61082dc40b... …and not go… really? As part of the core of libwebsocket? When you read the justification it’s mostly “well we have a good framework now, so why not use it for other things too?” C++ life. /shrug
- VikingCoder 3y agoWhen I have a chance, I want to compile this with Cosmopolitan Libc!
- pstuart 3y agoYes, and if that works, it would be great if jart could roll this into redbean.
- paulclinger 3y agoFWIW there is ongoing work with good progress to add websocket support to redbean (https://github.com/jart/cosmopolitan/pull/967 https://github.com/jart/cosmopolitan/pull/967)
- pstuart 3y agoGood to know. But the OP library adds even more (http2, MQTT). I've yet to actually build anything with redbean but the more functionality it has, the better. The project I'd like to explore with it would be to create a lua-based CLI toolkit a la the goodness that charmbracelet is building https://github.com/charmbracelet https://github.com/charmbracelet. Too many distractions atm and I don't have need of that CLI functionality so the impetus is lacking.
- matt3210 3y agoLove this library. Maintainer answers GitHub issues too!
- omeid2 3y agoGenuine question. With Rust and C++, even for embedded systems, what is the use case for starting a new project that does binary encoding and network with such an unsafe language like C? I find it almost inexcusable at this point.
- VikingCoder 3y agoFrom the website, "It has been developed continuously since 2010".
- synergy20 3y agowhatever software you're using, including HN the site, nearly all boil down to C at the bottom, C is fine, now and in the future.
- omeid2 3y agoIf we are playing that game, why stop there? why not ASM? Better yet, why don't you be a real developer and use a magnet?
- megous 3y agoBecause most people want portable programs, whithout having to rewrite them for each target. C helps a lot in this respect, compared to assembly.
- omeid2 3y agoGo on then, tell me which platform you can't use Rust or at least C++ when you can use C with standard library?
- megous 3y agoWhy would I do it? You compared C to asm, not rust.
- throwawayEmb 3y ago
- WanderPanda 3y agoDamn I just yesterday was pulling my hair out to get boost::beast to run (how unergonomic can an api be?!). Now I‘m considering to switch but what I really need is long term stability. I‘d rather like to not ever touch this code again, but it should compile over the next 5-10 years. I‘m not sure which one would be preferable in that regard
- jononor 3y agolibcurl? Old project, actively maintained, used in lots of embedded devices, maintainer understands the needs for stability, no silly rewrites.
- WanderPanda 3y agoAfaik libcurl is for clients only, but I also need to implement a server. Otherwise it sounds like exactly what I wish for from the governance perspective
- gary_0 3y agoThis looks promising: https://gitlab.com/eidheim/Simple-WebSocket-Server https://gitlab.com/eidheim/Simple-WebSocket-Server It includes http/https/ws/wss client and server code in just a few files (although last I checked, some files are needlessly duplicated in 2 different repos).
- fsloth 3y agolibcurl is excellent.
- macgyverismo 3y agoI started using this library last week. It was easy to get started and running. When I wanted to do stuff beyond the provided example I found nothing worked as I had expected. For example, you supply a user pointer when you create a lws_context. There is a user pointer argument in the callback where you do all the actual work. One would expect these to be the Same, but they are not. Instead you have to use two different calls to get from your current connection to the user pointer which is set for all connections. Did it work? Yes. But it was very suprising behavior. Another problem I ran into was getting the event loop to be non-blocking for use in a coroutine. Appearently I was expected to use one of the preselected event libraries, which I was not. I was expected to implement a dozen or so callbacks for which there was little or no helpfull documentation. Eventually I found that there was a hack where I could pass -1 to the timeout parameter. Now the service call was non blocking. It would have been fine if the call had blocked for a millisecond or so, but that did not work. So the time-out parameter was either -1 or any other value. I kept bumping into suprises like this. The library solved a problem for me, so I will continue to use it. Unfortunately I cant recommend it to anyone unless you are willing and able to spend a good portion of your time getting this beast tamed.
- doophus 3y agoI found the same with this library. I'm not sure if it's missing documentation, unintuitive design or both, but I always found it a bit of a struggle to use beyond simple cases.
- iforgotpassword 3y agoBut that "just" sounds like lacking documentation and a bit of missing support for you specific use case, or was anything actually broken or implemented in a completely stupid way? I didn't have to use websockets in C yet, but it would be good to have something ready in case I do at some point. Having to dig through source code instead of docs is something I'm used to. Are there any other contenders you looked at?
- numpad 3y agoI've had a very similar experience a few weeks ago and even fell for the same double-userdata misunderstanding. The documentation itself is actually good and extensive, however it feels like the authors expect its users to deeply understand the library itself. It is also harder to find some "Getting Started" docs as most provided examples felt way too bloated coming from a nodejs/ws background. Compared to the other library[1] I was considering, it took much longer to get even a simple "echo" server running. However having used lws for some time now, I am really happy with it! The API is very clean, mostly intuitive and provides everything you need, without feeling bloated or becoming too verbose. Sometimes documentation still feels a bit harder to find, but it can be figured out eventually. One great feature for me was being able to accept both WebSocket as well as raw TCP connections on the same port, this is extremely easy and just required settings the flag LWS_SERVER_OPTION_FALLBACK_TO_RAW. I encountered other hiccups. They are fully documented and completely valid, but were really confusing to me as a first-time user: * Sending data requires a specific memory layout[2] – namely having to allocate memory for the websocket header youself before the actual message you want to send. This gave me confusing segfaults in the beginning. * Sending data / responding to a client message will probably (but not always) fail when just naively using "lws_write()". To correctly send data you need to manually queue your message data, request the "ON_WRITABLE" callback[3] and only then actually send. [1]: https://github.com/Theldus/wsServer https://github.com/Theldus/wsServer [2]: https://libwebsockets.org/lws-api-doc-v3.0-stable/html/group__sending-data.html https://libwebsockets.org/lws-api-doc-v3.0-stable/html/group... (see the "IMPORTANT NOTICE") [3]: https://libwebsockets.org/lws-api-doc-main/html/group__callback-when-writeable.html https://libwebsockets.org/lws-api-doc-main/html/group__callb...
- ricardo81 3y agoI've used this at point in the past and it did seem relatively pain free to implement. Never quite got round to how certs could be reloaded though, while still honouring requests.
- 9659 3y agosteal the example programs, and make them your own. good performance, good reliability.