[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: non-blocking socket
From: |
Federico Montesino Pouzols |
Subject: |
Re: non-blocking socket |
Date: |
Fri, 13 Dec 2002 12:12:49 +0100 |
User-agent: |
Mutt/1.4i |
Yes, I think that replacing errInput with errNotConnected when
(rlen < 0) makes sense.
On Mon, Dec 09, 2002 at 09:02:52AM +0100, dani attila wrote:
> Hi,
>
> I don't know if the following things are features or a bugs, so
> I am sorry if I misunderstood something.
> I wanted to use TCPStream (or tcpstream) in a non-blocking
> mode, so I turned it on by stream.setCompletion(false). After
> I found it difficult to recognize if the stream was still
> connected or an error happend.
> If the remote host closes the connection isActive() and
> isConnected() still say the stream is OK. Maybe the error()
> function should modify the state member variable in an error
> condition!
> In the case of a reading from a non-blocking socket it can happen that
> there is not as many bytes as I want to read. Then, getErrorNumber()
> says errInput and stream.fail() = true. This ok but the result is
> the same if the socket was closed. Maybe getErr...() should
> return errNotConnected? Also, getErr..() should return errSuccess
> if a successful reading follows a bad one, becase now errid is
> never reseted.
> The folowing modification in TCPStream::underflow() maybe would
> solve the problem (same in readLine):
>
> int TCPStream::underflow()
> {
> ......
>
> if(!gptr())
> return EOF;
>
> if(gptr() < egptr())
> return (unsigned char)*gptr();
>
> rlen = (gbuf + bufsize) - eback();
> if(Socket::state == STREAM)
> rlen = ::read(so, (char *)eback(), rlen);
> else if(timeout && !Socket::isPending(pendingInput, timeout))
> {
> clear(ios::failbit | rdstate());
> error(errTimeout);
> return EOF;
> }
> else
> rlen = ::recv(so, (char *)eback(), rlen, 0);
> if(rlen < 1)
> {
> if(rlen < 0)
> {
> clear(ios::failbit | rdstate());
> error(errInput);
> }
> //!
> else {
> clear(ios::failbit | rdstate());
> error(errNotConnected);
> }
> //!
> return EOF;
> }
> //!
> error(errSuccess);
> //!
> setg(eback(), eback(), eback() + rlen);
> return (unsigned char) *gptr();
> }
>
>
> regards,
> Attila Dani
>
> ps.: I can detect correctly if a socket is closed with
> isPending() etc. , but maybe this would be more consistent
>
>
> _______________________________________________
> Bug-commoncpp mailing list
> address@hidden
> http://mail.gnu.org/mailman/listinfo/bug-commoncpp
- non-blocking socket, dani attila, 2002/12/09
- Re: non-blocking socket,
Federico Montesino Pouzols <=