mantech 48 1 декабря, 2019 Опубликовано 1 декабря, 2019 · Жалоба 11 часов назад, jcxz сказал: Вы нарисуйте себе диаграмму состояния сокета. Вот например: FIN_WAIT_2 -> TIME_WAIT -> CLOSED. Странно это выглядит, например, есть сервер, и клиент, который к нему подключился, происходит обрыв связи (перезагрузка клиента, например), в результате у сервера подвисает открытый порт, клиент перезагрузился, сбросил все свои порты, и вновь стучится к серверу, например, он не ждет все эти таймауты, и сразу делает коннект. Что в этом плохого, просто сервер откроет новый порт и все. Или по правилам надо ждать, пока оборванное соединение сбросится на сервере? Дак зачем, ну допустим у сервера закончились одновременно открытые порты - тогда и будет ждать, пока не освободятся. Вопрос, о долгоидущих пакетах, как уже было сказано, "По всем внутренним переменным сокета состояние TIME_WAIT ничем не отличается от CLOSED.", а следовательно соединение закрыто, то каким образом в уже закрытое соединение попадут эти пакеты? У них ведь нет запроса SYN_ACK? Они просто пропадут и все. Плюс к тому, раз в пол-секунды в стеке инкрементируется ID сессии, или как по другому называется, не помню, 32х битный счетчик. Или тут какой-то другой "тайный смысл"? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 224 1 декабря, 2019 Опубликовано 1 декабря, 2019 · Жалоба 5 часов назад, mantech сказал: Странно это выглядит, например, есть сервер, и клиент, который к нему подключился, происходит обрыв связи (перезагрузка клиента, например), в результате у сервера подвисает открытый порт, клиент перезагрузился, сбросил все свои порты, и вновь стучится к серверу, например, он не ждет все эти таймауты, и сразу делает коннект. Что в этом плохого, просто сервер откроет новый порт и все. Плохого в этом то, что Вы совсем не желаете прочитать ту ссылку, что я дал. Там как раз этот момент и разъясняется. И в приведённой мной выше цитате из той ссылки - тоже это объясняется. Если так не желать ничего изучить и прочитать, то объяснять можно бесконечно с 0-ым результатом. Потому, что если он вот так сразу откроет новый коннект (с этими-же самыми входящими и исходящими номерами портов и IP-адресами), то в этот новый коннект могут попасть фреймы задержанные в каких-то сегментах сети из старого коннекта. И нарушить его работу. Так как будет конфликт по номерам TCP-последовательностей. Вот чтоб такого не случалось и придумали TIME_WAIT. Цитата то каким образом в уже закрытое соединение попадут эти пакеты? У них ведь нет запроса SYN_ACK? Они просто пропадут и все. У этих пакетов есть идентифицирующие их принадлежность 4 параметра: IP локальный, IP удалённый, порт локальный, порт удалённый. Принадлежность с какому-то существующему соединению. Когда принятый пакет имеет эти параметры полностью совпадающие с параметрами существующего открытого соединения, то TCP-стек считает этот пакет принадлежащим данному соединению. И попадут они не в закрытое соединение, а во вновь открытое без задержки сразу после старта. Цитата Плюс к тому, раз в пол-секунды в стеке инкрементируется ID сессии, или как по другому называется, не помню, 32х битный счетчик. Это что за такое "ID сессии"? И зачем оно инкрементируется? Не помню такого в TCP/IP... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 48 1 декабря, 2019 Опубликовано 1 декабря, 2019 · Жалоба 6 часов назад, jcxz сказал: Это что за такое "ID сессии"? И зачем оно инкрементируется? Не помню такого в TCP/IP... Дабы не лезть совсем в дебри, выдернул из исходника UIP... /* Check if we were invoked because of the perodic timer fireing. */ } else if(flag == UIP_TIMER) { /* Increase the initial sequence number. */ if(++iss[3] == 0) { if(++iss[2] == 0) { if(++iss[1] == 0) { ++iss[0]; } } } -------------------------------- /* rcv_nxt should be the seqno from the incoming packet + 1. */ uip_connr->snd_nxt[0] = iss[0]; uip_connr->snd_nxt[1] = iss[1]; uip_connr->snd_nxt[2] = iss[2]; uip_connr->snd_nxt[3] = iss[3]; u8_t rcv_nxt[4]; /**< The sequence number that we expect to receive next. */ u8_t snd_nxt[4]; /**< The sequence number that was last sent by us. */ 6 часов назад, jcxz сказал: в этот новый коннект могут попасть фреймы задержанные в каких-то сегментах сети из старого коннекта. И нарушить его работу. Т.е. только из-за этого весь "сыр-бор"? Тогда понятно, просто в своих прогах всегда идентифицирую пакет по содержимому, вот и возникла "непонятка"... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
murmur 0 1 декабря, 2019 Опубликовано 1 декабря, 2019 (изменено) · Жалоба Не спорьте. Знатоки TOuchGFX, ответьте лучше на вопрос. Как по событию (нажатию кнопки) добавить новый элемент на экран, текст скажем? Я настроила событие, при нажатии кнопки вызывается C++ код. Как система выводит текст на экран по умлочанию? Вот все что есть в программе про текст touchgfx::TextArea textArea1; ........................................ textArea1.setXY(22, 40); textArea1.setColor(touchgfx::Color::getColorFrom24BitRGB(232, 225, 225)); textArea1.setLinespacing(0); textArea1.setTypedText(touchgfx::TypedText(T_SINGLEUSEID3)); add(textArea1); Я вставила этот же код (заменив 1 на 2) в обработку нажатия кнопки. В итоге на этом месте программа виснет (кнопка так и остается нажатой). Тот факт, что строка touchgfx::TextArea textArea1; находится в разделе protected, наводит на нехорошие мысли Вообще - можно ли создавать элементы динамически? Изменено 1 декабря, 2019 пользователем murmur Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться