4 ms·
This webserver is the most complete part of a high-level, cross-platform networking library I've been working on. The rest of the examples: https://github.com/u
by udp 15y ago
This webserver is the most complete part of a high-level, cross-platform networking library I've been working on. The rest of the examples: https://github.com/udp/lacewing/tree/master/examples https://github.com/udp/lacewing/tree/master/examples
ajax.cc is probably the most interesting - it's an example of long-poll AJAX with jQuery and Lacewing::Webserver as a backend. Lacewing uses epoll/kqueue/IOCP rather than a traditional select/poll approach, so it should scale quite well.
I've been developing Lacewing pretty much in private for quite a while, now - it's quite daunting when I start thinking about having to write all the documentation and such, but this morning I just thought "screw it, it's going on github, undocumented or not". It might as well be public while I'm getting it all together...
- Yoric 15y agoInteresting. Is there a specific purpose to this webserver?
- udp 15y agoI suppose it's just meant to be easily embeddable into just about anything. It could be used to add webserver functionality into an existing application (think web control interface for a daemon), or it could even be used to write a complete C/C++ web-application or backend. I don't want to make any claims about the performance of Lacewing (aside from anything else, it's too early for that) but one would assume a backend written in C/C++ would be a little faster than one written in a scripting language. Although probably quite a pain to write..! From a technical point of view, I found that most webservers were tuned for high performance on Unix, but on Windows they wouldn't run very well at all. The news earlier about Node.js having Windows support on the roadmap (which is mainly what prompted me to release Lacewing today) suggests that it's worth supporting, and Lacewing has used IOCP and other tricks on Windows from day one.
- jason_slack 15y agowhat about embedding in an iOS app? Any thoughts on this and if Apple will let is pass?
- udp 15y agoIt would certainly be interesting to try - do you know if kqueue is available on iOS? If not, I guess the only thing to do would be writing a select() or poll() fallback for the EventPump class. I might have a look at it sometime. Having said that, I'm not sure how much use the server stuff would be on iOS, and I haven't yet written the Unix implementation of the Client class (not that that will be very much work).
- tptacek 15y agoYes, iOS has working kqueue. I have some reason to believe you can get libevent working on iOS with minimal drama; I think there's at least one app that embeds it. Which, by the way, is what I would suggest you do with your code; if you're so dependent on kqueue that it's a portability issue, you have little to lose and lots to gain by ditching the custom event loop.
- udp 15y agoI support epoll and IOCP, too, and I don't consider event handling something complicated enough to justify bringing in an external library. I quite value the freedom of dependencies Lacewing currently has (except the obvious OpenSSL, etc - although it doesn't use OpenSSL on Windows, it uses native Windows SSL).
- tptacek 15y agolibevent is small enough to simply bake in and embed, which is what I usually do, but if you like your own event library that's fine.
- jasonlotito 15y agoGood Reader seems to use a web server to allow you to upload documents, so I don't think this is an issue.
- benologist 15y agoI downloaded an app that seems to embed an FTP server in itself (comicbook lover), if that passes muster then HTTP might be OK?
- dkersten 15y agoThanks for sharing! I was actually looking for a lightweight embeddable C/C++ web server not long ago, perhaps this will fit my needs. Only thing I'm wondering about is does it (or will it in the future) have windows and mac support? Ideally I am looking for something cross platform for what I have in mind. (My current solution is JVM based (over JNI) and uses Jetty, but I really want to eliminate the JVM dependency - I use it for more than just the web server, but the other stuff is easy enough to replace with C++ solutions)
- udp 15y agoYes, I've used it on both Windows and OS X, as well as Linux and FreeBSD servers. It uses IOCP on Windows and kqueue on OS X. There's a project file in the 'msvc' folder which should build out of the box on Windows - on OS X you probably need macports with autoconf/automake/libtool to build it.
- dkersten 15y agoAwesome! Thanks! I will definitely dig into this more over the coming days.
- luckystrike 15y agoYou can also check out libebb - http://tinyclouds.org/libebb/ http://tinyclouds.org/libebb/
- dkersten 15y agoThanks for the suggestion, I'll check it out.
- munificent 15y agoWow. Your code is a joy to read. Really clean and well-laid-out.
- udp 15y agoThanks, that's really nice to hear! :-) Some parts need improving, mainly because of how long I've been working on it - there were many gaps in my knowledge when I started. I don't think I've learnt so much from any project!
- mellery451 15y agoThanks for sharing. How does the basic functionality compare with, say, http://www.gnu.org/software/libmicrohttpd/ http://www.gnu.org/software/libmicrohttpd/ or http://cpp-netlib.github.com/ http://cpp-netlib.github.com/ ? (the latter looks like it might eventually be incorporated in boost).