webservices: Try to receive the whole message at once.
Signed-off-by: Hans Leidekker <hans@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
bd7c86bb4f
commit
26008a7b82
|
@ -1137,9 +1137,39 @@ done:
|
||||||
return hr;
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void set_blocking( SOCKET socket, BOOL blocking )
|
||||||
|
{
|
||||||
|
ULONG state = !blocking;
|
||||||
|
ioctlsocket( socket, FIONBIO, &state );
|
||||||
|
}
|
||||||
|
|
||||||
|
static int sock_peek( SOCKET socket )
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
char byte;
|
||||||
|
|
||||||
|
set_blocking( socket, FALSE );
|
||||||
|
ret = recv( socket, &byte, 1, MSG_PEEK );
|
||||||
|
set_blocking( socket, TRUE );
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int sock_recv( SOCKET socket, char *buf, int len )
|
||||||
|
{
|
||||||
|
int count, ret = 0;
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
if ((count = recv( socket, buf + ret, len, 0 )) <= 0) break;
|
||||||
|
ret += count;
|
||||||
|
len -= count;
|
||||||
|
if (sock_peek( socket ) != 1) break;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
static HRESULT receive_bytes( struct channel *channel, unsigned char *bytes, int len )
|
static HRESULT receive_bytes( struct channel *channel, unsigned char *bytes, int len )
|
||||||
{
|
{
|
||||||
int count = recv( channel->u.tcp.socket, (char *)bytes, len, 0 );
|
int count = sock_recv( channel->u.tcp.socket, (char *)bytes, len );
|
||||||
if (count < 0) return HRESULT_FROM_WIN32( WSAGetLastError() );
|
if (count < 0) return HRESULT_FROM_WIN32( WSAGetLastError() );
|
||||||
if (count != len) return WS_E_INVALID_FORMAT;
|
if (count != len) return WS_E_INVALID_FORMAT;
|
||||||
return S_OK;
|
return S_OK;
|
||||||
|
@ -1494,7 +1524,7 @@ static HRESULT receive_message_unsized( struct channel *channel, SOCKET socket )
|
||||||
if ((hr = resize_read_buffer( channel, max_len )) != S_OK) return hr;
|
if ((hr = resize_read_buffer( channel, max_len )) != S_OK) return hr;
|
||||||
|
|
||||||
channel->read_size = 0;
|
channel->read_size = 0;
|
||||||
if ((bytes_read = recv( socket, channel->read_buf, max_len, 0 )) < 0)
|
if ((bytes_read = sock_recv( socket, channel->read_buf, max_len )) < 0)
|
||||||
{
|
{
|
||||||
return HRESULT_FROM_WIN32( WSAGetLastError() );
|
return HRESULT_FROM_WIN32( WSAGetLastError() );
|
||||||
}
|
}
|
||||||
|
@ -1513,7 +1543,7 @@ static HRESULT receive_message_sized( struct channel *channel, unsigned int size
|
||||||
channel->read_size = 0;
|
channel->read_size = 0;
|
||||||
while (channel->read_size < size)
|
while (channel->read_size < size)
|
||||||
{
|
{
|
||||||
if ((bytes_read = recv( channel->u.tcp.socket, channel->read_buf + offset, to_read, 0 )) < 0)
|
if ((bytes_read = sock_recv( channel->u.tcp.socket, channel->read_buf + offset, to_read )) < 0)
|
||||||
{
|
{
|
||||||
return HRESULT_FROM_WIN32( WSAGetLastError() );
|
return HRESULT_FROM_WIN32( WSAGetLastError() );
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue