powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / recv выход из цикла
25 сообщений из 178, страница 2 из 8
recv выход из цикла
    #39710094
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovSergey_rbПервый пакет теряется даже в случает двух вызовов recv

Это очередной псевдокод или этот бред реально написан в программе? Он в принципе не
работоспособен от "strlen()" и ниже.


Это рабочий код
...
Рейтинг: 0 / 0
recv выход из цикла
    #39710104
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbЭто рабочий код

Это бредовый код, который по определению не может работать.

Sergey_rb
Код: sql
1.
i=strlen(rbuff);


Ага, щаззз. В буфере лежит просто пачка байт уже известной длины, а не null-terminated
string. Только stupid luck не позволяет тебе получить AV в этом месте.

Sergey_rb
Код: sql
1.
cp1251toUtf8(rbuff,sizeof(rbuff));


recv() занёс в буфер килобайтной длины три байта, но ты упорно пытаешься перекодировать
весь килобайт. Ню-ню...

Ниже этот бред повторён два раза.

Sergey_rb
Код: sql
1.
line.append(tmp);


Угу, из двух принятых кусков ты добавляешь к строке только последний и удивляешься куда
пропал первый. "Поздравляю, Шарик..." (с)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
recv выход из цикла
    #39710109
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Строка
Код: plaintext
1.
i=strlen(rbuff);



Действительно выдает длину строки, т.к. сервер выдает нул терминатед строку


Код: plaintext
1.
cp1251toUtf8(rbuff,sizeof(rbuff));



Если в буфере есть данные, то они конвертируются и выводятся в сообщении

Код: plaintext
1.
line.append(tmp);



Это можно было здесь и не писать, т.к. я отладку веду через MessageDox
...
Рейтинг: 0 / 0
recv выход из цикла
    #39710118
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbДействительно выдает длину строки, т.к. сервер выдает нул терминатед строку

То, что сервер её выдаёт, ещё не значит, что она дойдёт до тебя вся за один recv(). Ты
можешь получить первые пять байт сейчас, ещё два байта потом и последний байт когда-нибудь.

Sergey_rbЕсли в буфере есть данные, то они конвертируются и выводятся в сообщении

Повторяю медленно чисто из-за пятницы: если в буфере всего два принятых на этот раз байта,
а остальное набито мусором, оставшимся от предыдущих чтений, то что там у тебя
сконвертируется?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
recv выход из цикла
    #39710136
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не знаю, что в буфере, поэтому и пришел за советом
...
Рейтинг: 0 / 0
recv выход из цикла
    #39710149
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rb,

ты вроде как паскалист? Найди и скачай книгу: Антон Григорьев "О чем не пишут в книгах по Delphi"
Там есть отдельная глава, где подробно и понятно описана работа с tcp и достаточно примеров рабочего кода.
...
Рейтинг: 0 / 0
recv выход из цикла
    #39710160
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На Дельфи у меня все давно написано, сервер и терминалы работают по TCP уже лет пять.

Но один му**ло купил партию терминалов с WinCe7, на которой Паскаль программы не запускаются.

Теперь, чтобы исправить его косяк, мне надо написать прогу под WinCe7 на каком-то другом языке.

Единственная среда разработки под WinCe, которая не зависит от версии винды, это древний Embedded C++, который работает у меня на виртуальной машине под WinXP, потому что на более новых версиях он не работает.
...
Рейтинг: 0 / 0
recv выход из цикла
    #39710173
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbНа Дельфи у меня все давно написано, сервер и терминалы работают по TCP уже лет пять.

Но один му**ло купил партию терминалов с WinCe7, на которой Паскаль программы не запускаются.

Теперь, чтобы исправить его косяк, мне надо написать прогу под WinCe7 на каком-то другом языке.

Единственная среда разработки под WinCe, которая не зависит от версии винды, это древний Embedded C++, который работает у меня на виртуальной машине под WinXP, потому что на более новых версиях он не работает.
Ты какую-то лишнюю инфу выдаешь. При чем тут XP, виртмашины, кто там что купил?

Если нужно на другом языке работать - куда деваться. И никакой разницы - паскаль, не паскаль. Работа с tcp сокетами не зависит от языка.
...
Рейтинг: 0 / 0
recv выход из цикла
    #39710186
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КотовасияРабота с tcp сокетами не зависит от языка.

Мышевозники и компонентокидатели испытывают определённые трудности при переходе от
использования готовых фреймворков к настоящему программированию. В Дельфи за аффтара всё
делало INDY.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
recv выход из цикла
    #39710188
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovКотовасияРабота с tcp сокетами не зависит от языка.

Мышевозники и компонентокидатели испытывают определённые трудности при переходе от
использования готовых фреймворков к настоящему программированию. В Дельфи за аффтара всё
делало INDY.

В Indy тоже не так все на шару, как выяснилось. Потоки tcp сами собой в атомарные сообщения не превращаются.
Вообще, непонятно, что там ТС конкретно переделывает из паскаля, вот там работало, а тут уже не работает.
...
Рейтинг: 0 / 0
recv выход из цикла
    #39710213
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В Indy все просто -
На сервере
Код: pascal
1.
WriteStrings


Предает набор строк

На клиенте
Код: pascal
1.
ReadStrings


Получает набор строк и запихивает в StringList.

И никаких циклов, потерь данных и прочего мусора.
...
Рейтинг: 0 / 0
recv выход из цикла
    #39710260
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rb,

ты книгу Антона Григорьева нашел, скачал, изучаешь?
...
Рейтинг: 0 / 0
recv выход из цикла
    #39710951
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для тех, кто не верит, что TPC/IP передает данные пакетами.

авторЧто такое протоколы TCP/IP

TCP — Transfer Control Protocol. Протокол управления передачей. Он служит для обеспечения и установление надежного соединения между двумя устройствами и надежную передачу данных. При этом протокол TCP контролирует оптимальный размер передаваемого пакета данных , осуществляя новую посылку при сбое передачи.

IP — Internet Protocol. Интернет протокол или адресный протокол — основа всей архитектуры передачи данных. Протокол IP служит для доставки сетевого пакета данных по нужному адресу. При этом информация разбивается на пакеты , которые независимо передвигаются по сети до нужного адресата.


https://webonto.ru/protokolyi-tcp-ip-prostyim-yazyikom/
...
Рейтинг: 0 / 0
recv выход из цикла
    #39710959
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rb,

а это тебя в общем случае не касается, как там данные передаются. Тебя касается лишь то, как ты данные получаешь с помошью твоего api.
...
Рейтинг: 0 / 0
recv выход из цикла
    #39710961
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbДля тех, кто не верит, что TPC/IP передает данные пакетами.
А толку? Размер IP пакета не совпадает с размером твоего сообщения, поэтому за раз можно получить как целое сообщение так и часть сообщения.
...
Рейтинг: 0 / 0
recv выход из цикла
    #39710996
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TSergey_rbДля тех, кто не верит, что TPC/IP передает данные пакетами.
А толку? Размер IP пакета не совпадает с размером твоего сообщения, поэтому за раз можно получить как целое сообщение так и часть сообщения.

Как определить, что пришла только часть сообщения?
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711001
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbDima Tпропущено...

А толку? Размер IP пакета не совпадает с размером твоего сообщения, поэтому за раз можно получить как целое сообщение так и часть сообщения.

Как определить, что пришла только часть сообщения?
Алгоримом. В книжке, упомянутой мной ранее, есть эти алгоритмы.
Ты нашел, скачал, изучил, но не понял?
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711007
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КотовасияSergey_rb,

а это тебя в общем случае не касается, как там данные передаются. Тебя касается лишь то, как ты данные получаешь с помошью твоего api.

Я получаю функцией recv и она может вернуть как сообщение целиком, так и часть сообщения.

Нюанс в том, что после отправки сообщения, сервер не закрывает соединение с клиентом.
Поэтому нельзя отловить конец сообщения результатом recv < 0, как предлагается делать в примерах.
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711008
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КотовасияSergey_rbпропущено...


Как определить, что пришла только часть сообщения?
Алгоримом. В книжке, упомянутой мной ранее, есть эти алгоритмы.
Ты нашел, скачал, изучил, но не понял?

Причем здесь Дельфи?
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711009
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbDima Tпропущено...

А толку? Размер IP пакета не совпадает с размером твоего сообщения, поэтому за раз можно получить как целое сообщение так и часть сообщения.

Как определить, что пришла только часть сообщения?
Я вторым постом написал как 21688779 , но ты не веришь и упорно ищешь несуществующий способ.
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711014
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TSergey_rbпропущено...


Как определить, что пришла только часть сообщения?
Я вторым постом написал как 21688779 , но ты не веришь и упорно ищешь несуществующий способ.


авторОдно из двух:
1. Ты должен знать заранее сколько байт надо прочитать, т.е. перед данными передается их размер.
2. Есть какой-то маркер конца данных. Т.е. надо проверять что в принятом есть этот маркер.


1. Да, передается размер, но это размер не всего сообщения, а текущего пакета.
2. Что за маркер, это какой-то специальный символ?
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711032
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbDima Tпропущено...

Я вторым постом написал как 21688779 , но ты не веришь и упорно ищешь несуществующий способ.


авторОдно из двух:
1. Ты должен знать заранее сколько байт надо прочитать, т.е. перед данными передается их размер.
2. Есть какой-то маркер конца данных. Т.е. надо проверять что в принятом есть этот маркер.


1. Да, передается размер, но это размер не всего сообщения, а текущего пакета.
2. Что за маркер, это какой-то специальный символ?
1. О каком размере речь? О том что recv() вернул? Я про то чтобы сервер сначала передал размер данных, а затем сами данные.
2. Да, символ (или последовательность символов) заведомо не использующийся внутри сообщения. Например в протоколе HTTP конец заголовка это два перевода строки подряд.
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711040
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TSergey_rbпропущено...



пропущено...



1. Да, передается размер, но это размер не всего сообщения, а текущего пакета.
2. Что за маркер, это какой-то специальный символ?
1. О каком размере речь? О том что recv() вернул? Я про то чтобы сервер сначала передал размер данных, а затем сами данные.
2. Да, символ (или последовательность символов) заведомо не использующийся внутри сообщения. Например в протоколе HTTP конец заголовка это два перевода строки подряд.

1.У меня на сервере работают 100 терминалов и я не могу менять логику его работы
2.Два перевода строки подряд могут быть в любом тексте.
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711043
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для общего развития: допустим ты передал строку
Код: plaintext
В лесу родилась елочка
при передаче строка была разбита на пакеты
Код: plaintext
   1   |   2   |   3   |

TCP гарантирует что эти 3 пакета придут именно в той последовательности, как ты отправил, т.е. 2-й не придет раньше 1-го, но НЕ гарантирует что ты получишь все 3 вместе, т.е. может прийти например 1-й, а затем 2,3 вместе.

Это один из вариантов. В реальности пакет побольше ~1.5 кб, и может быть наоборот ситуация, когда в одном пакете несколько строк или начало в одном пакете, а конец в другом.
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711044
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbКотовасияпропущено...

Алгоримом. В книжке, упомянутой мной ранее, есть эти алгоритмы.
Ты нашел, скачал, изучил, но не понял?

Причем здесь Дельфи?
Да, при чем?
...
Рейтинг: 0 / 0
25 сообщений из 178, страница 2 из 8
Форумы / C++ [игнор отключен] [закрыт для гостей] / recv выход из цикла
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]