буфера из коннекшена не возвращает ошибку с io.EOF, как определить конец пакета. Можно конечно в начало пакета пихать размер данных, читать его и форычить пока он не будет достигнут. Но как-то это топорно. Неужели размера пакета нет на уровне протокола, чтоб не делать костыли?
Сейчас делаю так
func handleConnection(conn net.Conn) {
tmp := make([]byte, 1024)
data := make([]byte, 0)
received := 0
var packetLength = 0
for {
n, err := conn.Read(tmp)
if received == 0 {
packetLength = int(binary.BigEndian.Uint32(tmp))
}
if err != nil {
if err != io.EOF {
_ = conn.Close()
return
}
break
}
received += n
data = append(data, tmp[:n]...)
if packetLength == received {
received = 0
data = []byte{}
fmt.Println("Packet received")
}
}
}
передавать размер пакета — самая правильная практика
Я просто думал что размер пакета можно как-то вытащить из самого протокола, ну чтоб свой внутренний протокол внутри TCP не строить
TCP — предоставляет поток данных, про верхний уровень он ничего не знает Вот UDP позволяет явно передавать отдельные сообщения, но там придётся много чего самому городить поверх
Tcp про размеры своих пакетов тебе может сказать, про размер пакета данных, который ты пересылаешь через него, tcp знать ничего не может
Ок. Спасибо, услышал
Обсуждают сегодня