Re: WSAEWOULDBLOCK with WSASend/send
"Ulrich Eckhardt" <eckhardt@satorlaser.com>, haber iletisinde sunlari
yazdi:meesn3-glb.ln1@satorlaser.homedns.org...
Aslan wrote:
"Ulrich Eckhardt" <eckhardt@satorlaser.com>, haber iletisinde sunlari
yazdi:kj7sn3-s6b.ln1@satorlaser.homedns.org...
Hi!
I'm having trouble understanding why WSASend/send would return with
WSAEWOULDBLOCK. The point is that I didn't request an overlapped
operation and would be quite happy to have it block until it is
finished,
so why does it return with that error instead? Yes, I have seen that
the
MSDN calls this a 'non-fatal error' and that one should retry later,
but
that's plain stupid IMHO.
So you call send on a non-blocking socket. If it is OK for you to block
on
it, you should use a blocking socket.
For non-blocking socket, it means send() cannot be performed at that
time,
it seems OK to me.
Okay, so where do I get a blocking socket from? AFAIK, you have to
explicitly switch the socket into nonblocking mode by e.g. giving
WSA_FLAG_OVERLAPPED to WSASocket(), but I don't do that. Also, when
calling
WSAAccept(), how would I afterwards switch the socket to blocking mode?
Check ioctlsocket() function. You can use it to set blocking mode (as in
example below). Any call to WSAAsyncSelect() or WSAEventSelect() functions
automatically set a socket to non-blocking mode.
ULONG ul = 0L; // Disable non-blocking mode
if (::ioctlsocket(__CommSocket, FIONBIO, &ul) == SOCKET_ERROR)
{
nLastError = WSAGetLastError();
return -1;
}
Also, just for confirmation, when I read the docs I understand that when I
don't use the 'overlapped..' parts of the WSASend() parameters it should
behave like a blocking call, right? At least that's how I understand it.
thanks
Uli