On Sat, May 21, 2011 at 10:25:45PM -0400, Aaron Boxer <[email protected]> wrote:
> I found sample code that allows me to read and write from the socket
> using libev I/O events.
> But, I am not sure how to handle the read from NAS and processing.
> This could take some time.
> And I don't want to block the server while this is happening.

In general, what you do is enable non-blocking I/O, and then you have to
implement buffering, i.e. when you know there is readable data, you try to
read a good sized amount (e.g. 4096) into some buffer and then you try to
parse out your requests, keeping partial requests in the buffer for the
next read.

If you are experienced doing that it will not pose any problems, if not,
it can be a time-consuming task to get the details right the first time, and
naked libev doesn't help with any of the buffering.

It is, however, more flexible, and instructive, an you cna cut corners you
might not be abel to cut with a generic library.

Also, for writing, you need to do the same, as the socket wil only accept
so and so much data per time.

Recently somebody posted details about a networking library on top of
libev (https://github.com/coolaj86/libevn - haven't looked at it in
detail, presumably it handles buffering for you). There is also libevent
(which I wouldn't recommend in itself), which is weird, but it presumably
has quite powerful and full-featured buffer handling for sockets.

> Should this be done in another thread, and have the thread send the
> image data back to the client?

If you have only a few clients at a time, and locking is easy, then threads
might be simpler. If you have many clients, you probably want to use
something like libev. If you have even more and locking is easy, you might
want to have one thread per cpu core using libev, and if you have even more
clients you need to run with many processes, potentially on different hosts.

All depends on how much effort you want (or have to) go.

> I was planning on using a thread pool. But, perhaps libev can support
> a processing step without
> blocking?

Yes, libev is quite ideally suited for this problem as it efficiently gives
you events on when data is ready to be read or written.

It does only work on non-blocking handles though, files would always
be ready (because the data is there), so if you want to do files in an
event-based way, you could look at libeio (which implements a thread pool
for I/O).

-- 
                The choice of a       Deliantra, the free code+content MORPG
      -----==-     _GNU_              http://www.deliantra.net
      ----==-- _       generation
      ---==---(_)__  __ ____  __      Marc Lehmann
      --==---/ / _ \/ // /\ \/ /      [email protected]
      -=====/_/_//_/\_,_/ /_/\_\

_______________________________________________
libev mailing list
[email protected]
http://lists.schmorp.de/cgi-bin/mailman/listinfo/libev

Reply via email to