I suggest you read more on non-blocking sockets and event-driven programming. Basically, you're only supposed to use non-blocking sockets within an application that has an event loop, which uses poll() or similar to wait when sockets are ready. And *NEVER* do crap like retrying in timed intervals or whatever you're doing.
When you determine that you need to send N bytes to the client, you write those N bytes into a buffer of yours. You then do send() (in non-blocking mode) to send data from the buffer until you get EAGAIN/EWOULDBLOCK (or a real error, in which case you remove the client, closing the socket). If you do get EAGAIN/EWOULDBLOCK before you have sent everything, you request the event loop to notify you when this socket is again writable. When it is writable (i.e. event loop calls your event handler), you tell the event loop that you're no longer interested in this event, and you repeat the send()-ing to send more data from the buffer. And you keep doing this send-wait cycle until all of the data from the buffer is sent.
I am developing an open-source project which includes a framework for event-driven network applications. It does however make extensive use of flow-based programming and includes a new programming paradigm to make that easier. See http://code.google.com/p/badvpn/
If you're interested, a simple example of an event-driven program using my framework is in examples/stdin_input.c. This program reads stdin and prints data to the terminal as it receives it, and it also exits when a signal is received.