Запись более 255 символов данных в записи TXT или SPF
При написании рукописных DNS-сообщений с нуля, я могу отправлять TXT-записи до 255 символов с помощью этого псевдо- кодаC:
char use_this[1024];
memset(use_this, 0, 1024);
use_this[0] = len;
for (int i = 0; i < len; i++){
use_this[i + 1] = txt_record[i];
}
Он выходит из проволоки ОК. Однако, когда дело доходит до строк TXT или SPF с> 255 символами, я теряюсь и нуждаюсь в помощи!
|###[ DNS Resource Record ]###
| rrname = 'bbc.com.'
| type = SPF
| rclass = IN
| ttl = 748
| rdlen = 334
| rdata = '\xdav=spf1 ip4:212.58.224.0/19 ip4:132.185.0.0/16 ip4:78.136.53.80/28 ip4:78.136.14.192/27 ip4:78.136.19.8/29 ip4:89.234.10.72/29 ip4:74.112.66.33 ip4:208.251.80.51 ip4:89.202.185.0/24 ip4:207.159.133.98 ip4:207.159.133.99r include:msgfocus.com include:cmail1.com include:mktomail.com include:servers.mcsv.net include:redsnapper.net ?all'
ns = None
Для строки длиной в 336 символов это должно быть: [255][chars0:255] + [81][255:]
или же, [336][chars<>]
или что-то еще очевидно, что я пропустил?
Мы можем иметь записи TXT / SPF размером более 255 символов, но не более 255 символов в одной строке. Ищите указатели на то, как написать длинную запись (из нескольких строк), чтобы я мог отправить ее через базовый сокет. Спасибо!
1 ответ
Вы не можете вернуть фрагмент текста длиннее 255 байт, это не разрешено форматом DNS.
SPF позволяет разбить запись на фрагменты. в соответствии с https://tools.ietf.org/html/rfc7208 вы можете разбить строку в любой позиции, так как границы фрагментов не являются синтаксически значимыми, большинство людей разделяются между предложениями, но нет необходимости делать это так.
При возврате нескольких текстовых фрагментов просто объедините их так же, как это делается для доменных имен. В RFC ничего не говорится о разбиениях, которые обрезают сигнатуру "v=spf1 ", поэтому длина первого сегмента должна быть не менее 7 байтов.
[длина1 байт] "строка длины1" [длина2 байта] "строка длины2"
Можно использовать несколько фрагментов, даже если общая длина меньше 255.
Обязательно укажите длину байтов в расчете rdlen