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

 
 
4 страниц V  < 1 2 3 4 >  
Reply to this topicStart new topic
> lwip с Rtos или без Rtos, Как лучше, правильнее, удобнее использовать стек с rtos или без
scifi
сообщение Feb 3 2014, 13:00
Сообщение #31


Гуру
******

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



Цитата(sergey sva @ Feb 3 2014, 16:24) *
#define PBUF_POOL_BUFSIZE 256 / 4

Во-первых, пора бы знать, что макросы пишут со скобками: (256 / 4). А во-вторых, 64 байта - это слишком мало. Буквально на днях сам на этом обжёгся. lwip ожидает, что все заголовки пакета поместятся в первый pbuf, а у некоторых пакетов TCP заголовки бывают чуть больше, чем 64 байта. Я сделал 96.
Go to the top of the page
 
+Quote Post
sergey sva
сообщение Feb 3 2014, 13:51
Сообщение #32


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



У меня вот так задается PBUF_POOL_BUFSIZE
Код
/** Calculate memory size for an aligned buffer - returns the next highest
* multiple of MEM_ALIGNMENT (e.g. LWIP_MEM_ALIGN_SIZE(3) and
* LWIP_MEM_ALIGN_SIZE(4) will both yield 4 for MEM_ALIGNMENT == 4).
*/
#define PBUF_POOL_SIZE 16
#define MEM_ALIGNMENT  4
#ifndef LWIP_MEM_ALIGN_SIZE
#define LWIP_MEM_ALIGN_SIZE(size) (((size) + MEM_ALIGNMENT - 1) & ~(MEM_ALIGNMENT-1))
#endif

#define TCP_MSS 536
#define PBUF_LINK_HLEN 14
#define PBUF_POOL_BUFSIZE       LWIP_MEM_ALIGN_SIZE(TCP_MSS+40+PBUF_LINK_HLEN)

В DMA у меня по 2 буфера по 1536 каждый .
Как лучше подобрать эти параметры?
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Feb 3 2014, 14:00
Сообщение #33


Гуру
******

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



Цитата(sergey sva @ Feb 3 2014, 16:24) *
Как различаете соединения по портам если они все приходят на порт 80 и с одного айпи?


Соединение может быть установлено только между двумя сокетами, и для каждой пары сокетов может существовать только одно соединение.

Сокет - это тройка параметров
1. IP
2. ПОРТ
3. Тип соединения UDP/TCP

ваша тройка параметров фиксирована
IP, ПОРТ:80, TCP

значит для создания разных соединений будут меняться тройки параметров подключаемого устройства, так как протокол и IP наверняка фиксированны, единственное что может быть изменено это - номер порта.
Go to the top of the page
 
+Quote Post
sergey sva
сообщение Feb 3 2014, 14:15
Сообщение #34


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



Может есть готовые библиотеки работы с сокетами ?
Go to the top of the page
 
+Quote Post
sergey sva
сообщение Feb 3 2014, 15:35
Сообщение #35


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



Еще один вопрос новичка по lwip, после accept как получить destination port mac ip ?
Go to the top of the page
 
+Quote Post
MALLOY2
сообщение Feb 3 2014, 15:46
Сообщение #36


Знающий
****

Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317



Цитата
Буквально на днях сам на этом обжёгся. lwip ожидает ...


lwip ничего не ожидает, это ваше приложение может ожидать, можно сделать и один байт, главное что бы ваше приложение это учитывало и правильно собирало буфер.

Цитата
Как различаете соединения по портам если они все приходят на порт 80 и с одного айпи?


Как вы работаете со стеком я не знаю. Но может быть 3 варианта 1) Работа без ОС, 2) Работа с ОС через netconn интерфейс, 3) работа через сокеты (они тоже на самом деле работают через netconn просто это скрыто от пользователя что бы пользователь мог пользоваться стандартным интерфейсом сокетов)

в общем для первого варианта у вас есть функция

tcp_accept(listen_pcb, callback_accept);

которая устанавливает калбек функцию для нового соединения, у этой функции есть параметр struct tcp_pcb *pcb так вот этот pcb так вот этот pcb будет уникален для каждого соединения, следователь при записи или чтения использую эти pcb будете читать от того или другого клиента.

Для 2 и 3 случая все ток же создается уникальная структур (сокет) для каждого соединения.

Go to the top of the page
 
+Quote Post
scifi
сообщение Feb 3 2014, 15:54
Сообщение #37


Гуру
******

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



Цитата(MALLOY2 @ Feb 3 2014, 19:46) *
lwip ничего не ожидает, это ваше приложение может ожидать, можно сделать и один байт, главное что бы ваше приложение это учитывало и правильно собирало буфер.

Вы бы для начала заглянули в исходники lwip, вместо того чтобы нести всякую пургу.
Go to the top of the page
 
+Quote Post
sergey sva
сообщение Feb 3 2014, 16:08
Сообщение #38


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



Понятно. У меня первый вариант без ос. Вот еще какой момент для каждого соединения создаю структуру свою, в функции accept буду выделять память mem_malloc под эту структуру, а как ее найти и освободить после разрыва соединения. Где это проверять?
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Feb 3 2014, 17:33
Сообщение #39


Гуру
******

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



почитайте викизнание по LwIP

он сам сделает структуру для вас, и даст на нее указатель, надо его сохранить.
А когда соединение закроется, структура пометиться как мертвая, и функцией которая вызывается при медленном таймере уничтожится.

вообще при работе с lwip, он хорошо следить за своей памятью, и если в процесс ручками не залезть, и ничего не напортить. И следовать стандартному алгоритму вызовов, с отметками освобождения буферов, все будет хорошо.
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Feb 3 2014, 18:21
Сообщение #40


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

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



Цитата(scifi @ Feb 3 2014, 17:00) *
...у некоторых пакетов TCP заголовки бывают чуть больше, чем 64 байта. Я сделал 96.



там ышо могут быть оп-байты... не обязательный хвост в первом сегменте после заголовка IP. Так что первый кусочек может быть больше чем 96 sm.gif
так что уменьшать сильно не стоит... тем более, что практически каждую сессию броузеры корректируют этими опциональными
полями (см. любой снифер трафика).
Go to the top of the page
 
+Quote Post
sergey sva
сообщение Feb 3 2014, 19:09
Сообщение #41


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



Документация только здесь http://lwip.wikia.com/wiki/LwIP_Wiki ,может еще есть какие источники?
Как отправить много данных. В функции calback_receve когда приходит пакет делаю парсинг, нахожу что просят. И отправляю tcp_write иногда пакет больше TCP_SND_QUEUELEN. Пакет можно разбит на пакеты длиной TCP_SND_QUEUELEN, первый пакет отправлю сразу, когда и в какой функции отправлять остаток ?
Go to the top of the page
 
+Quote Post
scifi
сообщение Feb 3 2014, 19:17
Сообщение #42


Гуру
******

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



Цитата(kolobok0 @ Feb 3 2014, 22:21) *
там ышо могут быть оп-байты... не обязательный хвост в первом сегменте после заголовка IP. Так что первый кусочек может быть больше чем 96 sm.gif

Дык вроде бы размер опций ограничен 40 байтами. Так что всё нормально должно быть.
Go to the top of the page
 
+Quote Post
sergey sva
сообщение Feb 4 2014, 12:39
Сообщение #43


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



После того как сервер получает запрос Get tcp должен послать ACK ,а потом http 200 или 302 ответ.
Смотрю ваершарком запрос с пк уходит на плату приходит вывожу в терминал все правильно, но tcp ACk не отправляет может нужно еще что то запускать,или перезапустить?
Прикрепленное изображение
Go to the top of the page
 
+Quote Post
sergey sva
сообщение Feb 4 2014, 15:18
Сообщение #44


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



Собрал по примерам исходников функцию которая должна показывать страницу.
Принцип такой: как поступают данные в receive делаю парсинг и вызываю эту функцию:
Код
err_t ShowPage(void* arg,struct tcp_pcb *tpcb) {
    struct userstr *us = (struct userstr*) arg;
    char resp[150];
    u16_t lenresp = 0;
    memset(resp,0,150);
    err_t err = ERR_OK;
    u16_t len = us->SizePage;

    lenresp = sprintf(resp,    "HTTP/1.1 200 OK\r\nServer: Mutniiserver/2014-02-04\r\nContent-Type: text/html\r\nContent-Length: %i\r\nConnection: close\r\n\r\n",us->SizePage);
    tcp_write(tpcb, resp, lenresp, 0);

    UART_printf("send ... (%s) (%i)\n\r", resp,err);

    do {
        LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("Trying go send %d bytes\n", len));

        err = tcp_write(tpcb, us->PtrPageShow, len, 0);


        if (err == ERR_MEM) {
            if ((tcp_sndbuf(tpcb) == 0)    || (tcp_sndqueuelen(tpcb) >= TCP_SND_QUEUELEN)) {
                /* no need to try smaller sizes */
                len = 1;
            } else {
                len /= 2;
            }LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("Send failed, trying less (%d bytes)\n", len));
        }
    } while ((err == ERR_MEM) && (len > 1));

    UART_printf("post send ...  (%i)\n\r",err);

    if (err == ERR_OK) {
        LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("Sent %d bytes\n", len));
    } else {
        LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("Send failed with err %d (\"%s\")\n", err, lwip_strerr(err)));
    }

    us->lenght = len;
    return err;

} //

Но пока не хочет работать(
Go to the top of the page
 
+Quote Post
scifi
сообщение Feb 4 2014, 17:22
Сообщение #45


Гуру
******

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



Хотите написать свой веб сервер? Бросайте это гиблое дело: с вашим нынешним уровнем подготовки рано за такое браться. Тем более, что у lwip давно есть свой.
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 Текстовая версия Сейчас: 1st July 2025 - 18:40
Рейтинг@Mail.ru


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