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

 
 
> Вопрос по LwIP, сепарация копий pcb
Petr_
сообщение Mar 29 2016, 07:57
Сообщение #1





Группа: Участник
Сообщений: 14
Регистрация: 15-03-16
Пользователь №: 90 876



Всем добрый день.

Возник вопрос по разделению различных соединений TCP в LwIP.
Открываю первое соединение. В обработчике ...accept
получаю некий pcb (смотрю ссылку - она 536898084 (преобразование ссылки в число)).
Далее не закрывая предыдущее соединение открываю второе с того же IP
и к тому же порту! Это важно.
В ...accept получаю ссылку уже на другой pcb (536897788)
Все нормально.
Но далее замечаю, что данные поступают с обоих соединений на ОДИН из 2-х существующих pcb.
При открытии соединения с разных IP или на разные порты такой проблемы не возникает.

Вообще этот эффект (если я правильно его идентифицировал) вызывает
большие и непреодолимые проблемы при поддержке нескольких пользователей.
Допустим 2-й послал некую команду и закрыл соединение.
Закрылся первый pcb (для каждого уникального pcb я создаю уникальный контекст пользователя).
Это выгрузит контекст 1 из памяти и закроет 1-й pcb.
При этом пользователь 1 такую команду не подавал.
И кроме того контекст 2 и 2-й pcb не выгружены из памяти! Конечно они могут быть закрыты по таймеру, но это не решение вообще.

Ситуация, когда с одного IP и к одному порту создается несколько соединений абсолютно нормальна.
Это делают все браузеры для запросов разных объектов на странице (к порту 80).
Также (как пример) это может сделать Total Commander при открытии фоновой загрузки по FTP (к порту 21).
Поэтому ситуация абсолютно жизненная.

Этот вопрос в документации на LwIP не освещен абсолютно.
Кто что знает?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
scifi
сообщение Mar 29 2016, 09:39
Сообщение #2


Гуру
******

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



Внутри lwip код довольно нехитрый:
Код
  for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
    if (pcb->remote_port == tcphdr->src &&
       pcb->local_port == tcphdr->dest &&
       ip_addr_cmp(&(pcb->remote_ip), &current_iphdr_src) &&
       ip_addr_cmp(&(pcb->local_ip), &current_iphdr_dest)) {

      /* Move this PCB to the front of the list so that subsequent
         lookups will be faster (we exploit locality in TCP segment
         arrivals). */
      if (prev != NULL) {
        prev->next = pcb->next;
        pcb->next = tcp_active_pcbs;
        tcp_active_pcbs = pcb;
      }
      break;
    }
    prev = pcb;
  }

Нет причин ждать там подвоха. И, я думаю, такой косяк народ давно уже заметил бы и исправил.
Возможно, у вас память портится или что-то в этом духе. Недостаточный размер стека и всё такое. Всякое бывает.
Go to the top of the page
 
+Quote Post
Petr_
сообщение Mar 29 2016, 09:58
Сообщение #3





Группа: Участник
Сообщений: 14
Регистрация: 15-03-16
Пользователь №: 90 876



Хм. Спасибо за кусок кода - я его не искал, хотя и подозревал, что он должен быть таким (а что может быть иное...)
Правда это не исключает проблемы с содержимым любой из представленных переменных:D в силу некой скрытой проблемы.
Конечно о порче памяти и т.п. думал. Хотя ничего не виснет и других признаков проблем нет (софт выполняет и другие задачи).

Но в любом случае спасибо!

Я склоняюсь к мысли, что надо внимательно разглядывать входящий/исходящий порт соединения, может это наведет на корень проблемы.

Сообщение отредактировал IgorKossak - Mar 29 2016, 17:45
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
Go to the top of the page
 
+Quote Post
scifi
сообщение Mar 29 2016, 10:02
Сообщение #4


Гуру
******

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



У меня вообще были чудеса чудесные. Видимо, память утекала, пока он не отказывался отвечать на запросы (хотя пинг, по-моему, всё ещё работал). Поставил низший уровень оптимизации - отлегло. С тем компилятором я и до того глюки оптимизации видел (например MD5 считал неверно). Я снизил уровень оптимизации на средний, вроде бы всё заработало, а оказалось, что глюки полезли из других мест laughing.gif
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 19:01
Рейтинг@Mail.ru


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