Получение слишком большой ошибки датаграммы при обратной записи в NEAppProxyUDPFlowIOS

Программируем под IOS
Ответить
Anonymous
 Получение слишком большой ошибки датаграммы при обратной записи в NEAppProxyUDPFlow

Сообщение Anonymous »

Я пытаюсь настроить расширение с помощью DNSProxyProvider, которое перехватывает DNS-трафик по UDP, вставляет наш собственный идентификатор устройства и отправляет его на наш собственный DNS-сервер, который дает нам ответ, который я пересылаю запрашивающему клиенту.
Мне удалось добавить идентификатор к имени домена при отправке запроса на наш собственный DNS, и я отлично получаю ответ, но когда я пытаюсь записать ответ в udpflow, я получаю это ошибка в консоли Журналы.

Код: Выделить всё

Error Domain=NEAppProxyFlowErrorDomain Code=9 "The datagram was too large" UserInfo={NSLocalizedDescription=The datagram was too large}
Вот что я пробовал до сих пор.
  • Усечение размера дейтаграммы до размера менее 10 байт.
    Вот что я пробовал до сих пор.

    Усечение размера дейтаграммы до размера менее 10 байт.
    Вот что я пробовал до сих пор.

    Усечение размера дейтаграммы до размера менее 10 байт.
    Вот что я пробовал до сих пор.

    Усечение размера дейтаграммы до размера менее 10 байт.
    Вот что я пробовал до сих пор.

    Усечение размера дейтаграммы до размера менее 10 байт.
    Вот что я пробовал до сих пор.

    Усечение размера дейтаграммы до размера менее 10 байт.
    li>
    Отправка фиктивного объекта данных при попытке записи в поток.
    3)Двойная проверка подписи и возможностей для целей, приложения и сетевого расширения.
Ниже прикреплен код из моего NEDNSProxyProvider. DNS-запрос обрабатывается в функции handleNewFlow, которая вызывает процессUDPFlow

Код: Выделить всё

override func handleNewFlow(_ flow: NEAppProxyFlow) -> Bool {
if flow is NEAppProxyTCPFlow {
NSLog("BDDNSProxyProvider : Is TCP Flow...")
} else if let udpFlow = flow as? NEAppProxyUDPFlow {
NSLog("BDDNSProxyProvider: handleNewFlow : \(udpFlow)")
processUDPFlow(udpFlow) // < --
}

return true
}
< /code>
В коде ниже я объединяю доменное имя в запросе с DeviceID и отправьте его на наш сервер. Также есть строки журналов, пожалуйста, игнорируйте их.  < /P>
// Read incoming DNS packets from the client
private func processUDPFlow(_ udpFlow: NEAppProxyUDPFlow) {

self.udpAppProxyFlow = udpFlow
udpFlow.readDatagrams { datagrams, error in
if let error = error {
NSLog("Error reading datagrams: \(error.localizedDescription)")
return
}

guard let datagrams = datagrams else {
NSLog("No datagrams received.")
return
}

// Forward each DNS packet to the custom DNS server
for (index, packet) in datagrams.enumerated() {

let dnsMessage = self.parseDNSMessage(from: packet.0)
NSLog("tDatagram Header: \(dnsMessage.header)")
for question in dnsMessage.questions {
NSLog("tDatagram Question: \(question.name), Type: \(question.type), Class: \(question.klass)")
}
for answer in dnsMessage.answers {
NSLog("tDatagram Answer: \(answer.name), Type: \(answer.type), Data: \(answer.data)")
}

let oldDomain = self.extractDomainName(from: packet.0)!
let packetWithNewDomain = self.replaceDomainName(in: packet.0, with: "827-\(oldDomain)") // func to append device ID (827)

NSLog("Packet's new domain \(self.extractDomainName(from: packetWithNewDomain ?? packet.0) ?? "Found nil")")

self.sendToCustomDNSServer(packetWithNewDomain!) { responseDatagram in
guard let responseDatagram = responseDatagram else {
NSLog("Failed to get a response from the custom DNS server")
return
}

let tDatagram = (responseDatagram, packet.1)

udpFlow.writeDatagrams([tDatagram]) { error in
if let error = error {
NSLog("Failed to write DNS response back to client: \(error)")
} else {
NSLog("Successfully wrote DNS response back to client.")
}
}
}
}

// Continue Reading Datagrams
self.processUDPFlow(udpFlow)
}
}
Ниже приведена функция, которую я использую для замены имени домена.

Код: Выделить всё

func extractDomainName(from datagram: Data) -> String? {
// Ensure the datagram has enough data for a DNS header
guard datagram.count > 12 else { return nil }

// Start reading after the header (12 bytes)
var offset = 12
var domainName = ""

while offset < datagram.count {
// Read the length of the next label
let length = Int(datagram[offset])
offset += 1

// Check for the null terminator (end of domain name)
if length == 0 {
break
}

// Ensure there's enough data for the label
guard offset + length 

Подробнее здесь: [url]https://stackoverflow.com/questions/79382897/getting-a-datagram-too-large-error-while-writing-back-to-neappproxyudpflow[/url]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»