|
|
  |
LWIP Как послать данные (tcp_write) по событию? |
|
|
|
May 20 2014, 00:39
|
Знающий
   
Группа: Участник
Сообщений: 837
Регистрация: 8-02-07
Пользователь №: 25 163

|
Цитата Данная либа не позволяет послать фрагментированный UDP длинной 32 kB?!! У вас UDP пакеты длиной 32КБ? Фрагментация касается разбиения отдельных пакетов, когда они не влезают в MTU. Если у вас пакеты небольшие, то без фрагментации всё будет прекрасно работать на любых потоках.
|
|
|
|
|
May 20 2014, 03:04
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
А! ну у вас ошибка терминологии) Если у вас есть большие данные и вы их разбиваете на пакеты UDP - это не входит в ТСР/IP уровень. Это вы делаете сами, как умеете, сами обеспечиваете контроль целостности и так далее... Если у вас большие данные и вы их пихаете в сокет TCP, то это входит в TCP/IP уровень, стэк сам берет на себя задачу проверки того что данные дошли, что они пришли в нужном порядке, что они не повторились и так далее... При этом UDP пакет может придти только весь разом, и он не может быть больше 1500 байт (поправьте если я ошибаюсь). ТСР может идти порциями в зависимости от размера окна и прочего. При этом есть такая неприятность как внутрипакетная фрагментация - фрагментация одного пакета, обычно всякие WiFi этим грешат. Когда ваш один большой пакет UDP (но не больше 1500 байт) режут на порции и шлют кусками, такую фрагментацию также отрабатывает стэк (начиная с какой то версии), и собирает ваш единый пакет отдает вам целиком. Но это не значит что вы ему суните 32 КБайт данных, а стэк все сделает сам. Это верно только в случае ТСP, в случае UDP это придется сделать самому руками, да еще следить чтобы пакеты пришли в правильном порядке и без повторений. Причем когда вы это сделает, вы получите ТСР
|
|
|
|
|
May 20 2014, 03:34
|
Профессионал
    
Группа: Свой
Сообщений: 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.
|
|
|
|
|
Jun 4 2014, 04:41
|
Профессионал
    
Группа: Свой
Сообщений: 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] - для короткого!!!
|
|
|
|
|
Jun 4 2014, 05:52
|
Профессионал
    
Группа: Свой
Сообщений: 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?
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|