170 похожих чатов

Подскажите как отправить большой пакет порядка 1мб через TCP? Чтение

буфера из коннекшена не возвращает ошибку с 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")
}
}
}

5 ответов

5 просмотров

передавать размер пакета — самая правильная практика

Co.In-🇺🇦 🔜 Автор вопроса
Мерль
передавать размер пакета — самая правильная практи...

Я просто думал что размер пакета можно как-то вытащить из самого протокола, ну чтоб свой внутренний протокол внутри TCP не строить

Co.In 🇺🇦 🔜
Я просто думал что размер пакета можно как-то выта...

TCP — предоставляет поток данных, про верхний уровень он ничего не знает Вот UDP позволяет явно передавать отдельные сообщения, но там придётся много чего самому городить поверх

Мерль
TCP — предоставляет поток данных, про верхний уров...

Tcp про размеры своих пакетов тебе может сказать, про размер пакета данных, который ты пересылаешь через него, tcp знать ничего не может

Похожие вопросы

Обсуждают сегодня

я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
короче сгенерила мне эта штука код на ассемблере: struc string val { common local .value dq .value .value: if ~val eq db val end if db 0 } fo...
Vi Chapmann Chapmann
12
Всем привет! Массив вводится с клавиатуры, кол-во элементов неизвестно, поэтому я указал arr db 100 dup(?) С нахождением максимума проблем нет, а вот минимум почему-то всегд...
En Vind Av Sorg
11
Помогите, пожалуйста, делаю программу для для подсчёта корней квадратного уравнения, знаю, что есть куча недочётов, недоработок, но основная проблема в том, что почему-то при ...
NYC
13
#include <stdio.h> int main(void) { int n; scanf("%d", &n); int digits1[n] = {0}; int digits2[n] = {0}; я не могу таким образом заранее массив нулями заполнить?
Linus
12
в сях есть множество как в питоне? для удаление дубликатов
Linus
25
читать файл максимально быстро? странный вопрос))
zamtmn
53
я про форму записи. смысл указывать что 8 байтный регистр 8 байт?
Aiwan \ (•◡•) / _bot
10
Вроде бы вопрос уже заезжанный, но тем не менее У меня есть функция menu() которая выводит набор возможных действий, а затем спрашивает у пользователя что он хотел бы сделать....
David Golovatin
3
а как бы вылезти из ИО, что то типа IO -> Ether или в какую сторону смотреть ? что то туплю
Fedor
14
Карта сайта