[Libevent-users] GetQueuedCompletionStatus return values question/problem

Toby Douglass toby.douglass at summerblue.net
Fri Nov 3 03:06:48 EST 2006


Gordon Scott wrote:
>>> The two cases are differentiated by the fact that in case 4,
>>> *lpNumberOfBytes == 0.

>>> Now - here's the rub - what's to prevent *lpNumberOfBytes being 0 in
>>> case 3?  the docs say in case 3, the value in *lpNumberOfBytes is not
>>> set by GetQueuedCompletionStatus().  So, it would retain whatever value
>>> I set it to originally.  I'm thinking then that I need to set
>>> *lpNumberOfBytes to a value, say 1, and then if it's different, I'll be
>>> able to *know* it was set to 0.

> Not true.  As per the documentation in condition 3 sets the number of bytes
> read.  If there is an error and 0 bytes have been read, it will be set 
> to 0.

Thankyou - I had been thinking this in the past, but so many different 
things have been said in the list I'd lost sight of it!

> Setting a value of 1 would lead to problems for the same reason, what if 1
> byte was read?  -1 could be an option

It's a DWORD, so -1 is a theoretically valid value, although it's fine 
in practical terms.  But I'm looking for a better way - which basically 
means treating case 3 and 4 as the same and either not differentiating 
between them, or using GLE to differentiate.

> Really though, the difference between case 3 and 4 is that GetLastError()
> returns an error code in case 3, and it does not return an error code in
> case 4

You mean to say that it returns ERROR_SUCCESS in case 4 but never will 
in case 3?  is ERROR_SUCCESS what you get from say recv() when the other 
end has done a graceful close?  I'm thinking that the GLE you get is 
actually the GLE set by the socket operation.  Also, the problem again 
is that the possible GLE codes are *not* documented.  We may assert we 
*believe* we'll get ERROR_SUCCESS in case 4 and never in case 3, but how 
can we *know*?



More information about the Libevent-users mailing list