Hi Gabriele, I think this may have to do with the port being in async mode? Or did you test it in sync mode as well?
--Maarten > -----Original Message----- > From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf Of > Gabriele Santilli > Sent: vrijdag 21 november 2003 12:23 > To: [EMAIL PROTECTED] > Subject: [REBOL] [ports] [tcp] Detecting peer closing connection > > > Hello all, > > while doing some tests I and Romano have discovered a strange > behavior in REBOL TCP ports. I thought that, when the peer closes > the TCP connection, you got NONE returned by COPY on the TCP port; > however, it is not always so. > > We have discovered that, if there's data in the port output > buffer, and the port is in binary mode, when the peer closes teh > connection you'll get an empty binary (#{}) instead of NONE as the > result of COPY. > > This way it becomes difficult to know that the connection was > closed (because empty data also means "no new data available"). If > you are using PORT/AWAKE, however, you can assume that an empty > result is equivalent to NONE, since the AWAKE won't be called if > there's no new data available. > > Basically, if your PORT/AWAKE is like this: > > port/awake: func [port /local data] [ > data: copy port > either data [ > do-something-with data > ] [ > ; peer closed connection > close port > ; remove it from wait list, etc. > ] > ] > > it won't work if the port, at the time the peer closes the > connection, has data in the send buffer. > > You'll have to use, instead: > > port/awake: func [port /local data] [ > data: copy port > either any [none? data empty? data] [ > ; peer closed connection > close port > ; remove it from wait list, etc. > ] [ > do-something-with data > ] > ] > > that seems to work in every case. (Note: won't work if you have > ASYNC-MODES set to 'WRITE, since then the AWAKE would be called > even if no data is in the receive buffer.) > > I think this issue is the reason why some people (Gregg?) had > problems with async:// when peer closed the connection. I'll fix > my version of async:// soon (but becomes a bit complicated because > of the WRITE async mode). > > (BTW, I found the strange behavior, and Romano found out the > reason, so all the credit goes to him. :) > > Regards, > Gabriele. > -- > Gabriele Santilli <[EMAIL PROTECTED]> -- REBOL Programmer > Amiga Group Italia sez. L'Aquila --- SOON: http://www.rebol.it/ > > -- > To unsubscribe from this list, just send an email to > [EMAIL PROTECTED] with unsubscribe as the subject. -- To unsubscribe from this list, just send an email to [EMAIL PROTECTED] with unsubscribe as the subject.
