apr-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Davi Arnaut <d...@apache.org>
Subject Re: [PATCH] UDP Bucket Support
Date Tue, 13 Nov 2007 10:52:53 GMT
Henry Jen wrote:
> On Nov 12, 2007 6:41 PM, Davi Arnaut <davi@apache.org> wrote:
>> Paul Querna wrote:
>>> Adds: apr_bucket_socket_get_peer() and has the bucket read call recvfrom().
>>>
>>> Based on an earlier patch from Issac Goldstand.
>>>
>> [..]
>>
>>> -    rv = apr_socket_recv(p, buf, len);
>>> +    apr_socket_type_get(p, &sd_type);
>>> +    if (sd_type == SOCK_STREAM) {
>>> +        rv = apr_socket_recv(p, buf, len);
>>> +    } else {
>>> +        /* Is socket connected? */
>>> +        if (apr_socket_addr_get(&baton->peer, APR_REMOTE, p) != APR_SUCCESS)
{
>>> +            rv = apr_socket_recv(p, buf, len);
>>> +        } else {
>>> +            if (!baton->peer) {
>>> +                baton->peer = apr_bucket_alloc(sizeof(*baton->peer), a->list);
>>> +            }
>>> +            /* Caller is responsible for detecting peer on his own if needed
*/
>>> +            rv = apr_socket_recvfrom(baton->peer, p, 0, buf, len);
>>> +        }
>>> +    }
>> Why not cache the the peer and avoid a call to apr_socket_addr_get on
>> every read?
>>
> 
> UDP traffic can come from different peers.
> I wonder if we can simply call apr_socket_recvfrom for all non-stream protocols?

I think you missed my point. Since the patch exports apr_bucket_socket
why not let the user force a specific baton->peer (apr_sockaddr_t) ?

Something like:

} else {
	if (baton->peer || apr_socket_addr_get() == APR_SUCCESS)
		if (!baton->peer)
			baton->peer = apr_bucket_alloc();
		rv = apr_socket_recvfrom(baton->peer, p, 0, buf, len);
	else
		rv = apr_socket_recv(p, buf, len);
}

Regards,

--
Davi Arnaut

Mime
View raw message