Диапазон Swift превышает длину данных

У меня есть сервер Python, с которого я пишу и читаю, используя делегат потока. Он работает нормально, но когда я начинаю матч, и сервер отправляет данные обратно, он падает.

Вот где происходит сбой:

func checkForMessages() {
    while true {
        if inputBuffer.length < 4 {
            print("buffer length\(inputBuffer.length)")
            print( MemoryLayout.size(ofValue: Int()))
            print("application quit here")
            return
        }
        var msgLength = (inputBuffer.bytes).load(as: UInt32.self)
        msgLength = UInt32(bigEndian: msgLength)
        print(inputBuffer.length)
        print(msgLength)
        if inputBuffer.length < msgLength {
            print("its returning here!")
            return
        }

        // ******Crashes on the line Below******

        let message: Data? = inputBuffer.subdata(with: NSRange(location: 4, length: Int(msgLength)))
        processMessage(message!)
        let amtRemaining: Int = inputBuffer.length - Int(msgLength) - 4
        if amtRemaining == 0 {
            inputBuffer = NSMutableData()
        }
        else {
            print("Creating input buffer of length \(amtRemaining)")
            inputBuffer = NSMutableData(bytes: inputBuffer.bytes + 4 + Int(msgLength), length: amtRemaining)
        }
    }
}

Вылетает при настройке "разрешить сообщение".

Я пробовал пару вещей, например, пытался возиться с самим диапазоном, но я просто не совсем уверен, почему он делает то, что делает, я могу опубликовать код сервера, используемый для отправки сообщения обратно, если это необходимо.


person Daniel Cisneros    schedule 30.01.2018    source источник
comment
Сравните stackoverflow.com/questions/48340728/   -  person Martin R    schedule 30.01.2018


Ответы (1)


Итак, проблема была устранена заменой следующей части кода:

 if inputBuffer.length < msgLength {
        return
    }

с

 if inputBuffer.length < msgLength + 4 {
        return
    }
person Daniel Cisneros    schedule 03.02.2018