diff --git a/docs/socket_states.txt b/docs/socket_states.txt new file mode 100644 index 0000000..fe4f7c6 --- /dev/null +++ b/docs/socket_states.txt @@ -0,0 +1,53 @@ +each socket can have 4 states while reading or writing...well as far as i can +say....assuming is is nonblocking. +These can be checked via errno and return value. + + recv send errno +OK >0 >0 NOT SET +CLOSED REMOTELY 0 -1 (write)ECONNRESET +E_AGAIN -1 -1 EAGAIN|EWOULDBLOCK +ERROR OTHER -1 -1 AMYTHING ELSE + +This means we need a slightly different handling for reading and writing. +It might be neccessary to distinguish other streams from sockets albeit I +would like to prevent this... +This might be tested with small test programs. Well, the only special thing +is ECONNRESET in write mode...because this is something that would not +happen to files open for writing. +We need to be more selective when to close the socket. In fact there are +some errors, as EINTR which does not mean our socket is closed at all. + +Error which does not cause us to close the socket while writing: + +EAGAIN - go to poll +EINTR - try again +ENOBUFS - try again (maybe only a few times....) +ENOMEM - try again (maybe only a few times....) + +All other errors will cause us to close the socket while writing to it. + +Error which does not cause us to close the socket while reading: + +EAGAIN - go to poll +EINTR - try again +ENOMEM - try again (maybe only a few times....) + +All other errors will cause us to close the socket while reading from it. + +From a server view... +- read or write a socket as long as OK +- close if either indicated by read or write...maybe read or write themself + could do the close. +- poll if all socket get EAGAIN on read and write. + +So...read and write must be able to notify about 3 states at least. + +1. I am fine...continue operation on me +2. I could not continue right now...please poll me +3. Don't do any further operation on me...please close me. + +This could be simply done with return values... + +for 1. Return value >= 0 +for 2. Return -1 STREAM_DO_POLL +for 3. Return -2 STREAM_DO_CLOSE