[RPCRT4] support for RPC TCP servers

Robert Shearman rob at codeweavers.com
Mon Sep 25 11:54:30 CDT 2006


Damjan Jovanovic wrote:
> On 9/22/06, Robert Shearman <rob at codeweavers.com> wrote:
>> Using WSAEVENTs is an interesting approach, but I'd rather see Unix
>> sockets being used with a thread that select's on the socket and sets a
>> Win32 event instead. Also, I think this amount of nesting is confusing
>> and could be avoided.
>
> Are you working on that approach, or am I free to try it?

No, I am not working on that so you are free to try it. (You would be 
free to try it anyway, since your implementation might be better than an 
implementation I was working on.)

>
>> >
>> >  static int rpcrt4_conn_tcp_read(RpcConnection *Connection,
>> >                                  void *buffer, unsigned int count)
>> >  {
>> >    RpcConnection_tcp *tcpc = (RpcConnection_tcp *) Connection;
>> > -  int r = recv(tcpc->sock, buffer, count, MSG_WAITALL);
>> > -  TRACE("%d %p %u -> %d\n", tcpc->sock, buffer, count, r);
>> > -  return r;
>> > +  int rtotal = 0;
>> > +  int r = 0;
>> > +  do
>> > +  {
>> > +    r = recv(tcpc->sock, buffer, count, 0);
>> > +    if (r > 0)
>> > +      rtotal += r;
>> > +    else
>> > +      break;
>> > +  } while (rtotal < count);
>> > +  if (r < 0)
>> > +    rtotal = r;
>> > +  TRACE("%d %p %u -> %d\n", tcpc->sock, buffer, count, rtotal);
>> > +  return rtotal;
>> >  }
>> >
>>
>> Hmmm. Is the MSG_WAITALL flag not supported in winsock? I think that
>> should be fixed there.
>
> It isn't supported in the native winsock either. You think too highly
> of winsock - remeber it was made by Microsoft ;-).

Both MSDN and dlls/ws2_32/socket.c suggest that it is supported, 
although only in non-blocking mode. Is that the problem?

>
>> >
>> >  static int rpcrt4_conn_tcp_write(RpcConnection *Connection,
>> >                                   const void *buffer, unsigned int 
>> count)
>> >  {
>> >    RpcConnection_tcp *tcpc = (RpcConnection_tcp *) Connection;
>> > -  int r = write(tcpc->sock, buffer, count);
>> > +  int r = send(tcpc->sock, buffer, count, 0);
>> >    TRACE("%d %p %u -> %d\n", tcpc->sock, buffer, count, r);
>> >    return r;
>> >  }
>> >
>>
>> This is a good change. Please submit this as a separate fix.
>
> But if we use UNIX sockets, it shouldn't matter?

Correct. This won't make any difference either way, so we should use send.

-- 
Rob Shearman




More information about the wine-devel mailing list