|
|
  |
STM32F107 + RTL8201 + lwip-1.4.0, драйвер PHY для lwip |
|
|
|
Dec 23 2013, 13:03
|
Гуру
     
Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446

|
Всеравно пока не ясно как отослать много байт. Вот есть у кейла такой пример: Код #include <rtl.h> #include <string.h>
BOOL send_datalog () { U8 *sendbuf; U16 maxlen;
if (tcp_check_send (tcp_soc)) { /* The socket is ready to send the data. */ maxlen = tcp_max_dsize (tcp_soc); sendbuf = tcp_get_buf (maxlen); memcpy (sendbuf, data_buf, maxlen); tcp_send (tcp_soc, sendbuf, maxlen); return (__TRUE); } return (__FALSE); } Исходя из Код memcpy (sendbuf, data_buf, maxlen); я не могу услать больше чем maxlen. Что-то совсем не пойму как разбивка будет происходить. Ну вот ушла часть размером maxlen и еще три таких осталось. Помогите понять идею. Спасибо.
--------------------
Живи днем так, чтобы ночью ты спал спокойно.
|
|
|
|
|
Dec 23 2013, 13:21
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
вот так и будет у меня буфер в который я кладу данные на отправку. время от времени вызывается функция отправки. Если можно отправить весь буфер отправляю весь, если нет, то отправляю сколько можно, остальное остается в буфере до следующего раза. Отправка происходит как в примере, создается буфер с оптравляемыми данными (или частью если все отправить нельзя) и передается в сэнд. Если в этот раз сокет вообще не может отправлять, то весь буфер остается до след раза.
Вы про окно ТСР знаете? Во время работы то комму отправляете данные информирует вас о том количестве байт что он готов принять, и вы по какой угодно технологии, с буфером или без, с указателями или ДМА, вы не имеете права посылать больше чем он может принять. Так что следить за допустимым для отправки числом байт вы обязаны.
|
|
|
|
|
Dec 23 2013, 14:40
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
да в целом все просто, это способ контроля потока.
Окно - это размер памяти для приема новых данных, каждые поступающие данные уменьшают этот размер, каждые обработанные данные освобождают окно. При каждом ответе на прием данных сообщается также сколько еще данных осталось в окне, если окно забилось, то время от времени посылаются данные 0 длинны чтобы как только окно освободилось можно было дослать очередной кусок. Так же есть дополнительное автономное сообщение которое сообщает что окно освободилось.
принимаются данные в окно, как только вы обработали данные, вы их из окна извлекаете. Есть разные реализации освобождения окна, в кейле она единовременная на все окно. то есть допустим у вас окно 10, приняли 6 байт, окно стало 4, обработали 6 байт, сбрасываете окно и оно становится опять 10. Если вы обработали 2 байта, то у вас нет возможности извлечь только их сделав окно 6, пока все 6 не обработаете окно не освобождаете.
как только вы приняли 6 байт, больше 4 вам прислать не могут, как освободили окно может придти все 10 сразу. Чем больше окно - тем больше надо памяти, но тем быстрее работает стэк.
|
|
|
|
|
Dec 24 2013, 10:45
|
практикующий тех. волшебник
    
Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417

|
Цитата(smk @ Dec 24 2013, 13:29)  А как можно программно менять адрес и порт? Как потом программно актуализировать изменения? А порт нафик менять? Если у вас хост является Вашей железкой? Типа можете забыть и заюзать под другие дела порт? Или я не понял вопроса? Для задания адреса - либо инициализация его через дисплей, флэшку или ышо какой удобный способ(хоть джамперами набирай  ). Либо ышо просче - поднять DHCP. По поводу передачи запросов посредством HTML-я: копайте запросы GET и POST.
|
|
|
|
|
Dec 24 2013, 11:10
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
IP адрес можно менять на лету. заполняете структуру localm и все, вы работаете сразу на новом IP.
смена порта требует пересоздание сокетов.
у нас реализовано 2 варианта. 1. Бутлоадер. Грузиться с дефолтными настройками, с закрытыми сокетами. Запрашивает по DHCP новый адрес, если не получает грузиться с дефолтным адресом. Пользователь по UDP имеет возможность заменить IP адрес, и задать порт, так же по UDP подает команду на создание ТСР сокетов с указанным портом.
2. Штатная программа, все настройки сохраняет во флэш, там хранятся номера портов, IP адрес по умолчанию, режим работы с DHCP или без. Эти настройки можно менять через UDP и сохранять. После загрузки все ТСР сокеты сразу создаются, если надо сменить порт, меняем, сохраняем, и перезагружаем устройство.
для UDP порт не меняемый, и всегда один.
|
|
|
|
|
Dec 24 2013, 18:02
|
Гуру
     
Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446

|
Сделал как написано в: http://we.easyelectronics.ru/LPC/lpc1768rt...eb-updated.htmlВсе вроде как собралось, но при обращении получаю не свою страничку, а такое: Код HTTP 1.0 404 Error. File Not Found The requested URL was not found on this server. Что я делаю не так?
--------------------
Живи днем так, чтобы ночью ты спал спокойно.
|
|
|
|
|
Dec 24 2013, 18:26
|
практикующий тех. волшебник
    
Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417

|
Цитата(Golikov A. @ Dec 24 2013, 15:10)  ...по UDP имеет возможность заменить IP адрес... кхм. в таком случае пару вопросов: это в одном сегменте или грамотный перебор мостов-шлюзов? критерий тогда удалённости каков, и как долгий процесс(если не один сегмент) сканирования? Цитата(smk @ Dec 24 2013, 22:02)  ..при обращении получаю не свою страничку, а такое: Код HTTP 1.0 404 Error. File Not Found.. .. это значит, что по данному адресу страничка не найдена. ответ отдал сервак. т.е. алгоритм следующий... выясняете работоспособность вашего девайса, уровень ICMP эхо запрос-ответ. => юзаете команду ping юзаете с разными хитрыми параметрами - читайте справку к ней. особенно уделите внимание сборке на IP уровне. если всё ништяк(полезно так же смотреть на нижнем уровне что получаете на уровне пакетов), дальше запрашиваете страничку по 80 порту. смотрите на нижнем уровне такие вещи как 1) приход нефргаментированных IP пакетов (теоретически потом могут появится, если запросы на сервак будут не слабыми). 2) коректность сессии TCP 3) отдача HTML кода. если где затык - разбираетесь с данным уровнем. по идее в железке надо открыть порт на котором вы будете ждать запросы на вэб сервак(по умолчанию 80 порт - не SSL), и при запросе вида GET HTML отдать "файл" размеченный вэю страницей. всё дело контролируете на нижнем уровне снифером, и ышо смотрите что получает броузер (правая кнопка, просмотреть содержимое HTML). сравниваете что отослали и что получили. где то так
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|