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

 
 
4 страниц V  < 1 2 3 4 >  
Reply to this topicStart new topic
> LWIP Как послать данные (tcp_write) по событию?
scifi
сообщение May 19 2014, 08:54
Сообщение #16


Гуру
******

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



Цитата(doom13 @ May 19 2014, 16:57) *
Посоветуйте, что нового почитать, что-то в google ток эту нашёл.
Будет ли поддержка фрагментации в v1.3.2 (12.2009) или брать новую версию?

Можно попробовать почитать полуофициальный вики проекта. А поддерживается или нет - легко увидеть в исходниках: ищите макросы IP_FRAG и IP_REASSEMBLY.
Go to the top of the page
 
+Quote Post
doom13
сообщение May 19 2014, 09:19
Сообщение #17


Профессионал
*****

Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539



Цитата(scifi @ May 19 2014, 16:04) *
Можно попробовать почитать полуофициальный вики проекта. А поддерживается или нет - легко увидеть в исходниках: ищите макросы IP_FRAG и IP_REASSEMBLY.

Спасибо, глянем.
Go to the top of the page
 
+Quote Post
andrewlekar
сообщение May 20 2014, 00:39
Сообщение #18


Знающий
****

Группа: Участник
Сообщений: 837
Регистрация: 8-02-07
Пользователь №: 25 163



Цитата
Данная либа не позволяет послать фрагментированный UDP длинной 32 kB?!!

У вас UDP пакеты длиной 32КБ? Фрагментация касается разбиения отдельных пакетов, когда они не влезают в MTU. Если у вас пакеты небольшие, то без фрагментации всё будет прекрасно работать на любых потоках.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение May 20 2014, 00:46
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



проблема в том что макс пакет около 1500 байт, 1432 на данные. Даже если жумбо фрейм использовать и тогда 12 КБ край. Так что 32 КБайтные данные лучше самому порезать на порции и слать их. А учитывая что UDP не дает гарантии доставки, надо сверху еще протокольчик накинуть.
Go to the top of the page
 
+Quote Post
doom13
сообщение May 20 2014, 02:55
Сообщение #20


Профессионал
*****

Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539



Цитата(andrewlekar @ May 20 2014, 07:49) *
У вас UDP пакеты длиной 32КБ? Фрагментация касается разбиения отдельных пакетов, когда они не влезают в MTU. Если у вас пакеты небольшие, то без фрагментации всё будет прекрасно работать на любых потоках.


32 kB это для примера, но точно больше 1500, одним ethernet-пакетом не пошлёшь.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение May 20 2014, 03:04
Сообщение #21


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



А! ну у вас ошибка терминологии)

Если у вас есть большие данные и вы их разбиваете на пакеты UDP - это не входит в ТСР/IP уровень. Это вы делаете сами, как умеете, сами обеспечиваете контроль целостности и так далее...

Если у вас большие данные и вы их пихаете в сокет TCP, то это входит в TCP/IP уровень, стэк сам берет на себя задачу проверки того что данные дошли, что они пришли в нужном порядке, что они не повторились и так далее...

При этом UDP пакет может придти только весь разом, и он не может быть больше 1500 байт (поправьте если я ошибаюсь). ТСР может идти порциями в зависимости от размера окна и прочего. При этом есть такая неприятность как внутрипакетная фрагментация - фрагментация одного пакета, обычно всякие WiFi этим грешат. Когда ваш один большой пакет UDP (но не больше 1500 байт) режут на порции и шлют кусками, такую фрагментацию также отрабатывает стэк (начиная с какой то версии), и собирает ваш единый пакет отдает вам целиком. Но это не значит что вы ему суните 32 КБайт данных, а стэк все сделает сам. Это верно только в случае ТСP, в случае UDP это придется сделать самому руками, да еще следить чтобы пакеты пришли в правильном порядке и без повторений. Причем когда вы это сделает, вы получите ТСРsm.gif


Go to the top of the page
 
+Quote Post
doom13
сообщение May 20 2014, 03:34
Сообщение #22


Профессионал
*****

Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539



Цитата(Golikov A. @ May 20 2014, 07:56) *
проблема в том что макс пакет около 1500 байт, 1432 на данные. Даже если жумбо фрейм использовать и тогда 12 КБ край. Так что 32 КБайтные данные лучше самому порезать на порции и слать их.

Как бы IP поддерживает фрагментацию, а максимальная длинна UDP примерно 2^16 = 65kB.

Цитата(Golikov A. @ May 20 2014, 07:56) *
А учитывая что UDP не дает гарантии доставки, надо сверху еще протокольчик накинуть.

Если протяжённость сети измеряется не километрами и пакет не проходит через тучу маршрутизаторов, то, не смотря на отсутствие гарантий доставки, всё нормально работает без потерь данных при длинне UDP-пакета 32 kB и скорости передачи 655 Mbit/s (поднимал тему, Вы участвовали в обсуждении).

Цитата(Golikov A. @ May 20 2014, 10:14) *
А! ну у вас ошибка терминологии)

Позвольте не согласиться, с терминологией всё в порядке.

Цитата(Golikov A. @ May 20 2014, 10:14) *
Если у вас есть большие данные и вы их разбиваете на пакеты UDP - это не входит в ТСР/IP уровень. Это вы делаете сами, как умеете, сами обеспечиваете контроль целостности и так далее...

Данные большие 32 kB, но я их не разбиваю на пакеты UDP, а посылаю одним UDP-пакетом. В шапке IP используются флаги для фрагментирования данного пакета. Это не TCP, а UDP, который является одним из поддерживаемых TCP/IP-стеком (lwIP) протоколов. Вопрос был в том, что UDP поддерживается стеком, но без поддержки фрагментации (It can send, receive and forward packets, but can not send or receive fragmented IP packets).

Цитата(Golikov A. @ May 20 2014, 10:14) *
Если у вас большие данные и вы их пихаете в сокет TCP, то это входит в TCP/IP уровень, стэк сам берет на себя задачу проверки того что данные дошли, что они пришли в нужном порядке, что они не повторились и так далее...

Для передачи данных, как написал, хочу использовать UDP, не TCP.

Цитата(Golikov A. @ May 20 2014, 10:14) *
При этом UDP пакет может придти только весь разом, и он не может быть больше 1500 байт (поправьте если я ошибаюсь). ТСР может идти порциями в зависимости от размера окна и прочего. При этом есть такая неприятность как внутрипакетная фрагментация - фрагментация одного пакета, обычно всякие WiFi этим грешат. Когда ваш один большой пакет UDP (но не больше 1500 байт) режут на порции и шлют кусками, такую фрагментацию также отрабатывает стэк (начиная с какой то версии), и собирает ваш единый пакет отдает вам целиком. Но это не значит что вы ему суните 32 КБайт данных, а стэк все сделает сам. Это верно только в случае ТСP, в случае UDP это придется сделать самому руками, да еще следить чтобы пакеты пришли в правильном порядке и без повторений. Причем когда вы это сделает, вы получите ТСР

UDP-пакет может быть длинной больше 1500 байт (длинна UDP ограничена размером поля "UDP length" в шапке UDP), это ethernet-пакет ограничен длинной порядка 1500 байт. TCP использовать пока не приходилось, вот думаю опробовать при использовании lwIP.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение May 20 2014, 03:39
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



странно это все для меня, ну если вы говорите.... Надо будет перечитать стандарт на досуге
Go to the top of the page
 
+Quote Post
doom13
сообщение Jun 3 2014, 09:18
Сообщение #24


Профессионал
*****

Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539



В либе LwIP часто встречается термин PCB, если можно, поясните, что он означает?
Go to the top of the page
 
+Quote Post
scifi
сообщение Jun 3 2014, 09:36
Сообщение #25


Гуру
******

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



Цитата(doom13 @ Jun 3 2014, 17:28) *
В либе LwIP часто встречается термин PCB, если можно, поясните, что он означает?

Protocol Control Block. Структура, содержащая всю информацию о состоянии данного соединения.
Go to the top of the page
 
+Quote Post
doom13
сообщение Jun 3 2014, 09:40
Сообщение #26


Профессионал
*****

Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539



Цитата(scifi @ Jun 3 2014, 16:46) *
Protocol Control Block. Структура, содержащая всю информацию о состоянии данного соединения.

Спасибо, а то что-то никак не мог подобрать соответствующую расшифровку
Go to the top of the page
 
+Quote Post
doom13
сообщение Jun 4 2014, 04:41
Сообщение #27


Профессионал
*****

Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539



Нужна помощь, не могу понять, чего не хватает, чтобы udp пакет ушёл в сеть.

CODE
int main(void)
{
unsigned long ulUser0, ulUser1;
unsigned char pucMACArray[8];

ulUser0 = 0x00F263A8;
ulUser1 = 0x00800000;

pucMACArray[0] = ((ulUser0 >> 0) & 0xff);
pucMACArray[1] = ((ulUser0 >> 8) & 0xff);
pucMACArray[2] = ((ulUser0 >> 16) & 0xff);
pucMACArray[3] = ((ulUser1 >> 0) & 0xff);
pucMACArray[4] = ((ulUser1 >> 8) & 0xff);
pucMACArray[5] = ((ulUser1 >> 16) & 0xff);

unsigned long board_ip = 0xC0A80110;
unsigned long net_mask = 0xFFFFFF00;

lwIPInit(pucMACArray, board_ip, net_mask, 0, IPADDR_USE_STATIC);

struct udp_pcb *pcb;
pcb = udp_new();

struct ip_addr ip_rmt;

//udp_bind(pcb, (struct ip_addr *)&board_ip, 11000);
udp_bind(pcb, IP_ADDR_ANY, 11000);
udp_connect(pcb, &ip_rmt, 12000);


unsigned char buffer[128];
int i;
for(i = 0; i < 128; i++)
{
buffer[i] = i;
}

struct pbuf * pb;
pb = pbuf_alloc(PBUF_TRANSPORT, 128, PBUF_RAM);
memcpy(pb->payload, buffer, sizeof(buffer));

//udp_send(pcb, pb);
//udp_sendto(pcb, pb, &ip_rmt, 12000);
//pbuf_free(pb);

int tx_en = 0;

while(1)
{
if(tx_en)
{
udp_send(pcb, pb);
//udp_sendto(pcb, pb, &ip_rmt, 12000);
pbuf_free(pb);
tx_en = 0;
}
}
}


Сообщение отредактировал IgorKossak - Jun 4 2014, 14:02
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Jun 4 2014, 05:41
Сообщение #28


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



как минимум надо дергать еще функции LwIP которые обрабатывают стэк. Вы пока создали сообщение и добавили его в очередь, а сам стэк не работает...

tcp_fasttmr();

и еще для прочей работы

tcp_slowtmr();
Go to the top of the page
 
+Quote Post
doom13
сообщение Jun 4 2014, 05:52
Сообщение #29


Профессионал
*****

Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539



Цитата(Golikov A. @ Jun 4 2014, 12:51) *
как минимум надо дергать еще функции LwIP которые обрабатывают стэк. Вы пока создали сообщение и добавили его в очередь, а сам стэк не работает...

Почему не работает? Если пингануть плату - она ответит.

Цитата(Golikov A. @ Jun 4 2014, 12:51) *
tcp_fasttmr();
tcp_slowtmr();

Но это функции для работы по TCP протоколу, каким боком они к UDP?
Go to the top of the page
 
+Quote Post
scifi
сообщение Jun 4 2014, 06:11
Сообщение #30


Гуру
******

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



Цитата(doom13 @ Jun 4 2014, 14:02) *
Почему не работает? Если пингануть плату - она ответит.

Что-то не видно, как кадры из Ethernet принимаются и обрабатываются. В обработчике прерывания что ли?
Кстати, есть ещё ARP. Он тоже может задерживать отправку пакетов, и там есть таймеры.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 03:31
Рейтинг@Mail.ru


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