реклама на сайте
подробности

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> LWIP прием длинных пакетов
viakon
сообщение Aug 17 2015, 09:25
Сообщение #16


Местный
***

Группа: Участник
Сообщений: 290
Регистрация: 9-12-05
Из: г. Пермь
Пользователь №: 12 002



Цитата(scifi @ Aug 17 2015, 12:42) *
Именно так оно и работает.
И ещё раз повторяю: нужно быть готовым к тому, что эти 2 килобайта придут в виде 2048 пакетов по 1 байту каждый. Экзотика, да, но вполне законно. В этом случае просто подождать не получится - память закончится. Поэтому нужно в отдельном буфере накапливать данные по мере их поступления, не откладывая. И освобождать ненужные буферы сразу.

Как понять что пакет уже весь дошел?
Go to the top of the page
 
+Quote Post
scifi
сообщение Aug 17 2015, 09:35
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(viakon @ Aug 17 2015, 12:25) *
Как понять что пакет уже весь дошел?

Это уже должен протокол поверх TCP разбираться. Например, в HTTP есть заголовок Content-Length. Скажем, если написано "Content-Length: 2048", то браузер знает, что в ресурсе ровно 2048 байт. Когда все байты пришли - всё готово.
Так что вам виднее, как оно у вас должно работать.
Go to the top of the page
 
+Quote Post
dmitry-tomsk
сообщение Aug 18 2015, 13:16
Сообщение #18


Знающий
****

Группа: Свой
Сообщений: 672
Регистрация: 18-02-05
Пользователь №: 2 741



Цитата(scifi @ Aug 17 2015, 12:35) *
Это уже должен протокол поверх TCP разбираться. Например, в HTTP есть заголовок Content-Length. Скажем, если написано "Content-Length: 2048", то браузер знает, что в ресурсе ровно 2048 байт. Когда все байты пришли - всё готово.
Так что вам виднее, как оно у вас должно работать.

Делал LwIp на xilinx, на пакеты разбивает по 1460 байт, пакеты там связаны, нужно использовать поле tot_len pbuf. Удобно пользовать pbuf_copy_partial.
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Aug 18 2015, 19:24
Сообщение #19


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(alx2 @ Aug 12 2015, 07:46) *
...Говоря об IP корректно говорить о пакетах? ...нормальным, когда IP пакет, ...не имеет флага Don't fragment?....


ниже TCP естественно используется IP (см. стэк). И естественно на уровне IP есть понятие пакетов, есть и сборка пакетов,
есть и флаг не дефрагментировать.
Но ТС говорит: пакеты при использование LWIP соединение TCP. Т.е. речь идёт именно об использовании а не реализации или как работать
с пакетами IP чтоб получить поток в TCP. Т.е. ТС явно мыслит на уровне использования стэка TCP.

по поводу флага. Он (и кстати другие флаги - например быстрой передачи или скажем признак спец флагов спецификация которых закрыта
для гражданского использования) вполне может стоять, а может и не стоять. Это не есть обязательное условие при использовании
какого-либо протокола, в том числе и TCP.

Цитата(viakon @ Aug 17 2015, 09:32) *
...прослеживается следующая логическая цепочка. На компе после содинения TCP послылаются в сокет данные 2059 байт, естественно они разбиваются на 2 пакета. Первый пакет..


попробуйте перевёрнутым кроссом соединить два девайса напрямую и повторите эксперимент.
Вы сильно удивитесь увидев другой результат sm.gif

Я Вам более скажу, что если будете посылать из под винды - будет один результат (без свитчей связь). Если будете посылать с девайса например -
будет другой результат(где отключите максимальную длину IP пакета, ну или измените её...) Вплоть до 65кил пакеты IP можно гнать - тут
нет никаких проблем...


Цитата(viakon @ Aug 17 2015, 12:25) *
Как понять что пакет уже весь дошел?


Если используете TCP уровень - там нет пакетов. Ну нет...физически...
В силу реализации софта, и ситуации в канале связи на данный момент времени - результат по группировки пересылаемых данных
не определён. TCP гарантирует последовательную доставку данных... Т.е. выпихнули - обязательно получите...
выпихнули 100+20+30+555+1
получите (в той же самой последовательности) 222+1+483

Как Вы там будете барахтаться в этом потоке принятых данных - Ваше право... Хоть по признаку начала заголовка данных,
хоть передачей в заголовка самой длины данных, хоть ..... как угодно...
Go to the top of the page
 
+Quote Post
Hold
сообщение Jan 27 2017, 11:17
Сообщение #20


Участник
*

Группа: Участник
Сообщений: 40
Регистрация: 27-01-17
Пользователь №: 95 184



Цитата(dmitry-tomsk @ Aug 18 2015, 20:16) *
Делал LwIp на xilinx, на пакеты разбивает по 1460 байт, пакеты там связаны, нужно использовать поле tot_len pbuf. Удобно пользовать pbuf_copy_partial.

Как именно стоит использовать поле tot_len?
У себя делал следующим образом:
1. Принимаю пакет netconn_recv(conn, &inbuf);
2. Определял длину пакета buflen = netbuf_len(inbuf);
3. Выделял память DataPtr = pvPortMalloc(buflen);
4. И копировал туда весь буфер netbuf_copy(inbuf,DataPtr,buflen);
Вопрос вот в чем: отправляю файл 200 кбайт, по логам вижу как прилетают пакеты:
Код
192.168.10.21:60293 data len:1460
192.168.10.21:60293 data len:20
192.168.10.21:60293 data len:1460
192.168.10.21:60293 data len:60
192.168.10.21:60293 data len:1460
192.168.10.21:60293 data len:20
192.168.10.21:60293 data len:1460
192.168.10.21:60293 data len:40
192.168.10.21:60293 data len:1460
192.168.10.21:60293 data len:20
192.168.10.21:60293 data len:760
192.168.10.21:60293 data len:45

Как понять что я все принял? Вводить таймаут, городить свой протокол поверх? Понимаю что это просто поток байт, но почему-то думал что возможно отследить что мы все получили
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 27 2017, 11:29
Сообщение #21


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Hold @ Jan 27 2017, 13:17) *
Как понять что я все принял? Вводить таймаут, городить свой протокол поверх?
Если работаете с TCP - то это потоковый протокол, передача длины или признак конца данных осуществляется в протоколе более верхнего уровня.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
viakon
сообщение Jan 28 2017, 15:00
Сообщение #22


Местный
***

Группа: Участник
Сообщений: 290
Регистрация: 9-12-05
Из: г. Пермь
Пользователь №: 12 002



Цитата(Сергей Борщ @ Jan 27 2017, 16:29) *
Если работаете с TCP - то это потоковый протокол, передача длины или признак конца данных осуществляется в протоколе более верхнего уровня.


Т.е нужно писать свою обвязку к протоколу IP. Или не использовать длинные пакеты.

Сообщение отредактировал viakon - Jan 28 2017, 15:04
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 28 2017, 15:31
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Сергей Борщ @ Jan 27 2017, 13:29) *
Если работаете с TCP - то это потоковый протокол

TCP ни разу потоковый протокол. Он пакетный.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 28 2017, 18:20
Сообщение #24


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (zltigo @ Jan 28 2017, 17:31) *
TCP ни разу потоковый протокол. Он пакетный.
Сокет открывается с параметром SOCK_STREAM. "Совпадение? Не думаю!".

И как тогда перевести этот отрывак из RFC:
QUOTE
Basic Data Transfer:

The TCP is able to transfer a continuous stream of octets in each
direction between its users by packaging some number of octets into
segments for transmission through the internet system. In general,
the TCPs decide when to block and forward data at their own
convenience.




--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 28 2017, 21:12
Сообщение #25


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Сергей Борщ @ Jan 28 2017, 20:20) *
И как тогда перевести этот отрывак из RFC:

Да как угодно. Что было голове написавшего STREAM, как признак того, что для передаваемых ПАКЕТОВ, не гарантируется их нефрагментироание, мне неведомо. Для пакетов с гарантированным отсутствием фрагментации бывает поддержка SEQPACKET режима сокета.
Протокол вне зависимости от режима сокета чисто пакетный - оформление фрейма, размер... Поверх TCP, да уже действительно потоковые протоколы в прямом понимании этого слова, навешиваются.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 30th June 2025 - 15:01
Рейтинг@Mail.ru


Страница сгенерированна за 0.01417 секунд с 7
ELECTRONIX ©2004-2016