|
recv выход из цикла
|
|||
---|---|---|---|
#18+
Sergey_rb1.У меня на сервере работают 100 терминалов и я не могу менять логику его работы Что мешает работать по аналогии с терминалом? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2018, 16:23 |
|
recv выход из цикла
|
|||
---|---|---|---|
#18+
Dima TДля общего развития: допустим ты передал строку Код: plaintext
Код: plaintext
TCP гарантирует что эти 3 пакета придут именно в той последовательности, как ты отправил, т.е. 2-й не придет раньше 1-го, но НЕ гарантирует что ты получишь все 3 вместе, т.е. может прийти например 1-й, а затем 2,3 вместе. Это один из вариантов. В реальности пакет побольше ~1.5 кб, и может быть наоборот ситуация, когда в одном пакете несколько строк или начало в одном пакете, а конец в другом. И как мне это собрать в правильную последовательность строк? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2018, 16:27 |
|
recv выход из цикла
|
|||
---|---|---|---|
#18+
Dima TSergey_rb1.У меня на сервере работают 100 терминалов и я не могу менять логику его работы Что мешает работать по аналогии с терминалом? Терминальная прога написана на Лазарусе и там, аналог функции recv, возвращает сообщение целиком, а не кусками. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2018, 16:29 |
|
recv выход из цикла
|
|||
---|---|---|---|
#18+
Фееричный топик. Почему-то в последнее время я видел несколько похожих проблем вокруг себя. Да и сам (как ни странно) решаю сейчас аналогичную. Что же это, нашествие телепузиков в индустрию? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2018, 16:41 |
|
recv выход из цикла
|
|||
---|---|---|---|
#18+
MasterZivФееричный топик. Почему-то в последнее время я видел несколько похожих проблем вокруг себя. Да и сам (как ни странно) решаю сейчас аналогичную. Что же это, нашествие телепузиков в индустрию? Это всего лишь одна, криво написанная, функция recv. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2018, 16:43 |
|
recv выход из цикла
|
|||
---|---|---|---|
#18+
Решил вернуться к истокам, так сказать, проблемы... Sergey_rbПроблема в том, что, при завершении приема данных, функция recv переходит в режим ожидания следующего пакета. Это нормальное поведение этой фукнции. Так и должно быть. Sergey_rbПример кода: Код: plaintext 1. 2. 3. 4. 5. 6. 7.
Цикл выбирает все данные из буфера и останавливается в режиме ожидания на строке Это тоже нормально, и цикл нормальный. Sergey_rbКакие есть варианты выхода из цикла? На самом деле из этого цикла вообще выходить не надо . Как у тебя написано, так правильно, и так и должно всё работать. Ты выбираешь данные, обрабатываешь их когда надо, потом выбираешь следующие. (т.е. в цикл надо ещё где-то добавить обработку этих данных). Когда клиент завершает соединение, он закроет сокет, и твой recv вернёт что-то меньше 0-ля и твой цикл завершится. После этого ты должен закрыть серверный сокет , возможно, что-то ещё освободить и завершить с серверной стороны, и завершить серверный поток (либо сокет убрать из числа обрабатываемых). А что же ты хочешь в твоём вопросе -- не понятно вообще. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2018, 16:48 |
|
recv выход из цикла
|
|||
---|---|---|---|
#18+
MasterZivРешил вернуться к истокам, так сказать, проблемы... Sergey_rbПроблема в том, что, при завершении приема данных, функция recv переходит в режим ожидания следующего пакета. Это нормальное поведение этой фукнции. Так и должно быть. Sergey_rbПример кода: Код: plaintext 1. 2. 3. 4. 5. 6. 7.
Цикл выбирает все данные из буфера и останавливается в режиме ожидания на строке Это тоже нормально, и цикл нормальный. Sergey_rbКакие есть варианты выхода из цикла? На самом деле из этого цикла вообще выходить не надо . Как у тебя написано, так правильно, и так и должно всё работать. Ты выбираешь данные, обрабатываешь их когда надо, потом выбираешь следующие. (т.е. в цикл надо ещё где-то добавить обработку этих данных). Когда клиент завершает соединение, он закроет сокет, и твой recv вернёт что-то меньше 0-ля и твой цикл завершится. После этого ты должен закрыть серверный сокет , возможно, что-то ещё освободить и завершить с серверной стороны, и завершить серверный поток (либо сокет убрать из числа обрабатываемых). А что же ты хочешь в твоём вопросе -- не понятно вообще. Я на каждой странице пишу одну фразу - соединение, после передачи данных, не закрывается! ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2018, 16:51 |
|
recv выход из цикла
|
|||
---|---|---|---|
#18+
Sergey_rbЯ на каждой странице пишу одну фразу - соединение, после передачи данных, не закрывается! И тебе каждый раз на это отвечают, что это совершенно пофиг. Тебе не нужно выходить из цикла. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2018, 16:59 |
|
recv выход из цикла
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovSergey_rbЯ на каждой странице пишу одну фразу - соединение, после передачи данных, не закрывается! И тебе каждый раз на это отвечают, что это совершенно пофиг. Тебе не нужно выходить из цикла. В этом случае recv останавливается, ждет следующей порции данных от сервера и программа зависает. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2018, 17:04 |
|
recv выход из цикла
|
|||
---|---|---|---|
#18+
Sergey_rbВ этом случае recv останавливается, ждет следующей порции данных от сервера и программа зависает. ОБРАБАТЫВАЙ ПРИНЯТЫЕ ДАННЫЕ ВНУТРИ ЦИКЛА по мере их поступления. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2018, 17:11 |
|
recv выход из цикла
|
|||
---|---|---|---|
#18+
После обработки последнего пакета, recv ничего не возвращает, а ждет новый пакет. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2018, 17:23 |
|
recv выход из цикла
|
|||
---|---|---|---|
#18+
Sergey_rbDima Tпропущено... Что мешает работать по аналогии с терминалом? Терминальная прога написана на Лазарусе и там, аналог функции recv, возвращает сообщение целиком, а не кусками. Если терминальная прога работает, значит можно тоже самое повторить в любой другой проге. Чудес не бывает. recv() получает все тоже самое что и терминальная прога, проблема тут только в том что ты не можешь корректно запустить recv(). Наверно где-то есть описание протокола обмена, т.е. описание в каком формате сервер дает ответ, надо только поискать. Если нет, то запиши входящие данные в файл и смотри что там "лишнее", т.к. лишней там будет вспомогательная инфа для определения границ сообщений. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2018, 17:27 |
|
recv выход из цикла
|
|||
---|---|---|---|
#18+
Dima TSergey_rbпропущено... Терминальная прога написана на Лазарусе и там, аналог функции recv, возвращает сообщение целиком, а не кусками. Если терминальная прога работает, значит можно тоже самое повторить в любой другой проге. Чудес не бывает. recv() получает все тоже самое что и терминальная прога, проблема тут только в том что ты не можешь корректно запустить recv(). Наверно где-то есть описание протокола обмена, т.е. описание в каком формате сервер дает ответ, надо только поискать. Если нет, то запиши входящие данные в файл и смотри что там "лишнее", т.к. лишней там будет вспомогательная инфа для определения границ сообщений. Я прекрасно знаю, в каком формате передается информация с сервера, т.к. я сам его написал. А передается она в виде строк, разделенными символами переноса строк 13 и 10. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2018, 17:29 |
|
recv выход из цикла
|
|||
---|---|---|---|
#18+
Sergey_rbDima Tпропущено... Если терминальная прога работает, значит можно тоже самое повторить в любой другой проге. Чудес не бывает. recv() получает все тоже самое что и терминальная прога, проблема тут только в том что ты не можешь корректно запустить recv(). Наверно где-то есть описание протокола обмена, т.е. описание в каком формате сервер дает ответ, надо только поискать. Если нет, то запиши входящие данные в файл и смотри что там "лишнее", т.к. лишней там будет вспомогательная инфа для определения границ сообщений. Я прекрасно знаю, в каком формате передается информация с сервера, т.к. я сам его написал. А передается она в виде строк, разделенными символами переноса строк 13 и 10. ОЛЛО! ОБРАБАТЫВАЙ ПРИНЯТЫЕ ДАННЫЕ ВНУТРИ ЦИКЛА по мере их поступления. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2018, 17:32 |
|
recv выход из цикла
|
|||
---|---|---|---|
#18+
Sergey_rbТерминальная прога написана на Лазарусе и там, аналог функции recv, возвращает сообщение целиком, а не кусками. Как функция в лазарусе называется? Если исходники той проги есть, то покажи как прием прописан, быстрее помогут на С++ переписать. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2018, 17:34 |
|
recv выход из цикла
|
|||
---|---|---|---|
#18+
Dima TSergey_rbТерминальная прога написана на Лазарусе и там, аналог функции recv, возвращает сообщение целиком, а не кусками. Как функция в лазарусе называется? Если исходники той проги есть, то покажи как прием прописан, быстрее помогут на С++ переписать. Это я тоже уже писал на предыдущей странице авторВ Indy все просто - На сервере WriteStrings Предает набор строк На клиенте ReadStrings Получает набор строк и запихивает в StringList. И никаких циклов, потерь данных и прочего мусора. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2018, 17:36 |
|
recv выход из цикла
|
|||
---|---|---|---|
#18+
Возможно, единственный выход - это, как было предложено, искать два переноса строк подряд, но это уже совсем лоховская тема. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2018, 17:37 |
|
recv выход из цикла
|
|||
---|---|---|---|
#18+
Sergey_rbавторВ Indy все просто - На сервере WriteStrings Предает набор строк На клиенте ReadStrings Получает набор строк и запихивает в StringList. И никаких циклов, потерь данных и прочего мусора. Я так подозреваю что все циклы и прочий "мусор" спрятаны внутри этих функций. Подобные вещи не стандартизированы, поэтому за пределами твоего Indy это не работает и надо разбираться как оно реально устроено в Indy. Сделай WriteStrings() двух строк "123" и "abc", прими recv() все что придет, запиши в файл и выложи сюда этот файл. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2018, 17:46 |
|
recv выход из цикла
|
|||
---|---|---|---|
#18+
Sergey_rbВозможно, единственный выход - это, как было предложено, искать два переноса строк подряд, но это уже совсем лоховская тема. Я это не предлагал. Это был пример как отделен заголовок в протоколе HTTP. У тебя не HTTP, поэтому не надо искать то чего нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2018, 17:47 |
|
recv выход из цикла
|
|||
---|---|---|---|
#18+
Sergey_rbЭто я тоже уже писал на предыдущей странице Писать-то ты горазд, но вот заглянуть в исходники WriteStrings() и прочитать их - тебе уже не по плечу. Sergey_rbВозможно, единственный выход - это, как было предложено, искать два переноса строк подряд С какого перепою ты решил, что твой сервер следует соглашениям HTTP? Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2018, 17:50 |
|
recv выход из цикла
|
|||
---|---|---|---|
#18+
Dima TSergey_rbпропущено... Я так подозреваю что все циклы и прочий "мусор" спрятаны внутри этих функций. Подобные вещи не стандартизированы, поэтому за пределами твоего Indy это не работает и надо разбираться как оно реально устроено в Indy. Сделай WriteStrings() двух строк "123" и "abc", прими recv() все что придет, запиши в файл и выложи сюда этот файл. Для небольших сообщений, менее 2 Кб все прекрасно работает, т.к. это сообщения помещаются в один пакет. Проблема начинается при приеме больших сообщений, т.к. протокол разбивает их на пакеты. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2018, 17:51 |
|
recv выход из цикла
|
|||
---|---|---|---|
#18+
Sergey_rbПроблема начинается при приеме больших сообщений, т.к. протокол разбивает их на пакеты. Да, именно так работает TCP и именно это тебе твердят с самого начала. Но до тебя никак не доходит. Видимо, твой мозг работает по UDP. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2018, 17:52 |
|
recv выход из цикла
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovSergey_rbЭто я тоже уже писал на предыдущей странице Писать-то ты горазд, но вот заглянуть в исходники WriteStrings() и прочитать их - тебе уже не по плечу. Sergey_rbВозможно, единственный выход - это, как было предложено, искать два переноса строк подряд С какого перепою ты решил, что твой сервер следует соглашениям HTTP? 1. Смотрел, там сначала берется количество строк, затем они считываются. 2. Я писал, что использую протокол HTTP? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2018, 17:53 |
|
recv выход из цикла
|
|||
---|---|---|---|
#18+
Sergey_rbВозможно, единственный выход - это, как было предложено, искать два переноса строк подряд, но это уже совсем лоховская тема. Ты хотя бы ПЕРВЫЙ ПЕРЕНОС СТРОК НАЙДИ , блин... ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2018, 17:53 |
|
recv выход из цикла
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovSergey_rbПроблема начинается при приеме больших сообщений, т.к. протокол разбивает их на пакеты. Да, именно так работает TCP и именно это тебе твердят с самого начала. Но до тебя никак не доходит. Видимо, твой мозг работает по UDP. Они работают в режиме открытия и закрытия сокета. В моем сервере, сокет, после отправки/принятия сообщения, не рвет соединение. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2018, 17:54 |
|
|
start [/forum/topic.php?fid=57&msg=39711070&tid=2017750]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
27ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
others: | 258ms |
total: | 382ms |
0 / 0 |