Мне удалось добавить идентификатор к имени домена при отправке запроса на наш собственный 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)Двойная проверка подписи и возможностей для целей, приложения и сетевого расширения.
Код: Выделить всё
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]
Мобильная версия