You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
53 lines
1.9 KiB
53 lines
1.9 KiB
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
|