ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
11 июля
367308 Топик полностью
VVB (09.11.2012 11:17, просмотров: 664) ответил VVB на Кстати, пользуясь тем хорошим фактом, что Вы знакомы c lwIP (почему-то с ним мало работают, в России), хочу задать вопрос.
Ещё вопросы по lwIP. Меня не устраивает поведение стека при отсутствии линка и имеющемся активном TCP соединении, передающем данные от девайса. Поведение следующее. Вызываемая функция netconn_write() через некоторое время отсутствия линка возвращает код ошибки ERR_ABRT. Всё понятно -- соединение разорвано. Логично, что я в данном случае хочу вызвать netconn_delete(), затем заново создать соединение netconn_new(), привязать его netconn_bind() и установить связь с ПК netconn_connect(). Однако, здесь кроется коварная засада: после вызова netconn_delete() так называемый "protocol control block" для удаляемого TCP соединения не освобождается (стек хочет-таки передать те данные, которые не передались, в момент вызова netconn_delete). И вызов netconn_bind() после удаления и повторного создания соединения возвращает ошибку, так как порт уже привязан к одному из "protocol control block". Соответственно, до того момент как этот pcb не будет удалён, я не смогу даже попытаться установить новое соединение по причине сбоя netconn_bind(). pcb таки удаляется стеком через некоторое время. Это нормальное поведение? Непонятна ещё следующая ситуация. Вот у меня платка отсылает в комп по TCP данные. Типичный размер сегмента 720..740 байт. Тут комп вдруг отвечает (в подтверждении на принятый от прибора сегмент), что его window = 710 байт (я качал файл по сети), а стек lwIP хочет отправить 740 байт. Такая ситуация приводит к тому, что стек почему-то не переразбивает тот TCP сегмент, который хочет отправить, на более мелкие (максимальным размером 720 байт), и отправляет сегмент с полезной длиной всего 1 байт, без признака PUSH, но зато с ACK. После этого передача данных от прибора останавливается до момента разрыва соединения с компом, потом без рестарта прибора можно установить новое TCP соединение и снова передавать данные без проблем. Видимо, определение IP_FRAG влияет на то, что данные перестали передаваться? В соответствии со стандартами TCP/IP, передатчик не имеет права отправлять пакеты длиной более чем может принять принимающая сторона.