[fpc-pascal] Buffer size for TCP DNS queries in netdb

Michael Van Canneyt michael at freepascal.org
Sun Sep 27 10:19:09 CEST 2020



On Sun, 27 Sep 2020, Noel Duffy via fpc-pascal wrote:

> On 26/09/20 9:07 pm, Michael Van Canneyt via fpc-pascal wrote:
>> 
>> On Sat, 26 Sep 2020, Noel Duffy via fpc-pascal wrote:
>>> To restate the question, is 64k too much overhead for DNS queries? That 
> overhead would be present on all queries, regardless of whether UDP or TCP 
> was used.
>> 
>> I would then prefer to allocate a dynamic buffer. A simple "Array of Byte" 
> can
>> easily be managed with SetLength() and it is automatically disposed of when
>> not needed.
>
> An unintended consequence of attempting to replace the TPayLoad static array 
> with a dynamic one is that the TQueryData record can no longer be passed to 
> fpSendTo as a stream of octets by passing a pointer to it.
>
> I.e,
>
>   Function Query(Resolver : Integer; Var Qry,Ans : TQueryData; QryLen : 
> Integer;
> 	Var AnsLen : Integer) : Boolean;
>   begin
>   [...]
>     fpsendto(sock, at qry,qrylen+12,0, at SA,SizeOf(SA));
>
> When TPayLoad is made dynamic, the final member of TQueryData changes from an 
> array of octets to a pointer. Now passing a pointer to Qry results in the 
> pointer to the dynamic array being serialized instead of the query payload. 
> Naturally the DNS server will turn up its nose at that and return a 
> sternly-worded error code in protest.
>
> The payload data will have to be manually serialized to octets, I think. At 
> least I don't know of any way to serialize a record that contains pointers 
> using any feature of the language or api in the RTL. Doing manual 
> serialization will also require more memory, of course. The quantities aren't 
> huge, though, so I don't think it matters hugely. But more experienced FPC 
> developers may be able to recommend a better way, of course!

Hm. I don't think this is a good way then. Seems like a little too much
overhead: allocating a buffer for TPayload, and then allocating a second one
for sending everything in 1 block to the server. This will impact speed
significantly.

Probably it is then better to go for 2 kinds of records, one for UPD, one
for TCP ?

Michael.


More information about the fpc-pascal mailing list