With C TCP sockets, can 'send' return zero

2019-01-11 04:44发布

问题:

Is it ever possible for the C send function to return zero when using TCP sockets? The man page just says that it will return the number of bytes sent, but I am not sure if it will just return -1 when it can't send any data.

回答1:

I'm pretty certain, though the memory is deep in the mists of time, that I've seen it return zero before, in the situation of massive data transfers where the other end was not keeping up.

From memory, in that case, the remote TCP stack buffers had filled up, the stack had notified the local end that it was to delay until some space was cleared out and the local buffers had filled up as well.

At that point, it's not technically an error (hence no -1 returned) but no data could be accepted by the local stack.

I'm not entirely certain that's the case now since the current Posix standard seems to indicate it will simply block in that case (or fail if it's set up for non-blocking).

However, I suspect it's a moot point. You do have the possibility that it will return less than the bytes you requested to send and you therefore should have code in place to handle that.

And, since it will be pretty much the same logic handling 'one less than what you requested' as handling 'zero bytes', you may as well assume it can return zero.



回答2:

Well, there is always the case where you passed in zero as the number of bytes to send... in that case, "returning the number of bytes sent" would indicate that it should return zero bytes.

Probably best to handle the returns-zero case properly anyway; it can't hurt, and it might help.



回答3:

The answer to this may well be implementation dependent and therefore vary based on the operating system.

One circumstance where 0 would be expected, when you request a transmission of 0 bytes.



回答4:

The BSD man page states:

If no messages space is available at the socket to hold the message to be transmitted, then send() normally blocks, unless the socket has been placed in non-blocking I/O mode.

The Posix specification goes further and states that in blocking mode all data is transferred, unless an interrupt occurs.

In both cases zero cannot be returned unless the count supplied was zero.



回答5:

I do observe a zero return from the send(2) on an AF_UNIX type socket right now.

Yepp, it was due to the size field of zero value.

So, JFYI.