|
recv выход из цикла
|
|||
---|---|---|---|
#18+
есть проблема чтения данных из сокета, а именно - протокол TCP/IP передает поток байтов от сервера к клиенту пакетами. Размер пакетов имеет разную длину, которые помещаются в буфер, из которого функция recv и считывает данные Приходится читать их в цикле. Проблема в том, что, при завершении приема данных, функция recv переходит в режим ожидания следующего пакета. Пример кода: Код: plaintext 1. 2. 3. 4. 5. 6. 7.
Цикл выбирает все данные из буфера и останавливается в режиме ожидания на строке Код: plaintext 1.
Какие есть варианты выхода из цикла? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.09.2018, 09:51 |
|
recv выход из цикла
|
|||
---|---|---|---|
#18+
Одно из двух: 1. Ты должен знать заранее сколько байт надо прочитать, т.е. перед данными передается их размер. 2. Есть какой-то маркер конца данных. Т.е. надо проверять что в принятом есть этот маркер. Обычно делают по первому варианту. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.09.2018, 09:59 |
|
recv выход из цикла
|
|||
---|---|---|---|
#18+
Sergey_rb, почитай про setsockopt и опцию SO_RCVTIMEO ... |
|||
:
Нравится:
Не нравится:
|
|||
28.09.2018, 10:11 |
|
recv выход из цикла
|
|||
---|---|---|---|
#18+
Dima TОдно из двух: 1. Ты должен знать заранее сколько байт надо прочитать, т.е. перед данными передается их размер. 2. Есть какой-то маркер конца данных. Т.е. надо проверять что в принятом есть этот маркер. Обычно делают по первому варианту. Первый вариант не подходит, а второй можно попробовать ... |
|||
:
Нравится:
Не нравится:
|
|||
28.09.2018, 10:18 |
|
recv выход из цикла
|
|||
---|---|---|---|
#18+
Sergey_rb, Делаешь сокет O_NONBLOCK и читаешь в цикле пока recv не вернёт ошибку EWOULDBLOCK ... |
|||
:
Нравится:
Не нравится:
|
|||
28.09.2018, 11:13 |
|
recv выход из цикла
|
|||
---|---|---|---|
#18+
Sergey_rbесть проблема чтения данных из сокета, а именно - протокол TCP/IP передает поток байтов от сервера к клиенту пакетами. Нет, ты ошибаешься, передача TCP идёт потоком. Пакетов никаких нет. авторРазмер пакетов имеет разную длину, которые помещаются в буфер, из которого функция recv и считывает данные Приходится читать их в цикле. Проблема в том, что, при завершении приема данных, функция recv переходит в режим ожидания следующего пакета. Пример кода: Код: plaintext 1. 2. 3. 4. 5. 6. 7.
Цикл выбирает все данные из буфера и останавливается в режиме ожидания на строке Код: plaintext 1.
Какие есть варианты выхода из цикла? recv возвращает отрицательное число при закрытии сокета и прочих проблемах. Вот это и надо проверять. Всё это есть в документации. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.09.2018, 11:37 |
|
recv выход из цикла
|
|||
---|---|---|---|
#18+
1. Ты должен знать заранее сколько байт надо прочитать, т.е. перед данными передается их размер. Это не обязательно. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.09.2018, 11:38 |
|
recv выход из цикла
|
|||
---|---|---|---|
#18+
Sergey_rbпротокол TCP/IP передает поток байтов от сервера к клиенту пакетами. "Неправильно ты, дядя Фёдор, бутерброд ешь." Надо говорить так: "протокол TCP/IP передает поток байтов". Точка. Никакого разделения на "пакеты", видимые прикладному уровню, в нём нет. Sergey_rbПроблема в том, что, при завершении приема данных, функция recv переходит в режим ожидания следующего пакета. Это не проблема. Проблема в том, что ты принятые байты не обрабатываешь сразу по принятии. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
28.09.2018, 11:46 |
|
recv выход из цикла
|
|||
---|---|---|---|
#18+
MasterZivSergey_rbесть проблема чтения данных из сокета, а именно - протокол TCP/IP передает поток байтов от сервера к клиенту пакетами. Нет, ты ошибаешься, передача TCP идёт потоком. Пакетов никаких нет. авторРазмер пакетов имеет разную длину, которые помещаются в буфер, из которого функция recv и считывает данные Приходится читать их в цикле. Проблема в том, что, при завершении приема данных, функция recv переходит в режим ожидания следующего пакета. Пример кода: Код: plaintext 1. 2. 3. 4. 5. 6. 7.
Цикл выбирает все данные из буфера и останавливается в режиме ожидания на строке Код: plaintext 1.
Какие есть варианты выхода из цикла? recv возвращает отрицательное число при закрытии сокета и прочих проблемах. Вот это и надо проверять. Всё это есть в документации. Сокет не закрывается после получения данных ... |
|||
:
Нравится:
Не нравится:
|
|||
28.09.2018, 12:36 |
|
recv выход из цикла
|
|||
---|---|---|---|
#18+
Sergey_rbDima TОдно из двух: 1. Ты должен знать заранее сколько байт надо прочитать, т.е. перед данными передается их размер. 2. Есть какой-то маркер конца данных. Т.е. надо проверять что в принятом есть этот маркер. Обычно делают по первому варианту. Первый вариант не подходит, а второй можно попробовать Второй вариант не прокатил, т.к. в потоке есть символы перевода строки ... |
|||
:
Нравится:
Не нравится:
|
|||
28.09.2018, 12:40 |
|
recv выход из цикла
|
|||
---|---|---|---|
#18+
Sergey_rbСокет не закрывается после получения данных Поэтому-то твой цикл и не завершается. Обрабатывая данные внутри него. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
28.09.2018, 12:40 |
|
recv выход из цикла
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovSergey_rbСокет не закрывается после получения данных Поэтому-то твой цикл и не завершается. Обрабатывая данные внутри него. Не закрывается, потому что так устроен обмен. Увеличил размер буфера, чтобы в него гарантированно помещался весь объем принятых данных, Каждый раз размер данных получается разный. потому что передача идет пакетами, причем размер пакетов произвольный, поэтому считывать надо в цикле. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.09.2018, 12:59 |
|
recv выход из цикла
|
|||
---|---|---|---|
#18+
Sergey_rbКаждый раз размер данных получается разный. потому что передача идет пакетами, причем размер пакетов произвольный, поэтому считывать надо в цикле. Ты ещё не знаешь, что пакеты могут как делиться на части, так и склеиваться в один. Повторяю медленно: обрабатывай каждую принятую порцию данных внутри своего цикла. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
28.09.2018, 13:12 |
|
recv выход из цикла
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovSergey_rbКаждый раз размер данных получается разный. потому что передача идет пакетами, причем размер пакетов произвольный, поэтому считывать надо в цикле. Ты ещё не знаешь, что пакеты могут как делиться на части, так и склеиваться в один. Повторяю медленно: обрабатывай каждую принятую порцию данных внутри своего цикла. Я их обрабатываю Мне надо знать, когда функция recv считала последний пакет. проверка на количество считанных байтов не подходит, т.к. оно больше 0 Проверка на наличие символа \n тоже не прокатывает, т.к. в пакете есть символы перевода строки. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.09.2018, 13:40 |
|
recv выход из цикла
|
|||
---|---|---|---|
#18+
В INDY сначала считывается количество полученных строк, затем считываются строки. Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
... |
|||
:
Нравится:
Не нравится:
|
|||
28.09.2018, 13:45 |
|
recv выход из цикла
|
|||
---|---|---|---|
#18+
Sergey_rbМне надо знать, когда функция recv считала последний пакет. Не существует в природе никакого "последнего пакета". За исключением того, после которого соединение закрывается. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
28.09.2018, 14:09 |
|
recv выход из цикла
|
|||
---|---|---|---|
#18+
Sergey_rbВ INDY сначала считывается количество полученных строк Значит инди сначала передаёт количество передаваемых строк. О чём тебе и говорили: передавай длину данных перед самими данными. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
28.09.2018, 14:11 |
|
recv выход из цикла
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovSergey_rbМне надо знать, когда функция recv считала последний пакет. Не существует в природе никакого "последнего пакета". За исключением того, после которого соединение закрывается. да не закрывается соединение. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.09.2018, 14:19 |
|
recv выход из цикла
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovSergey_rbВ INDY сначала считывается количество полученных строк Значит инди сначала передаёт количество передаваемых строк. О чём тебе и говорили: передавай длину данных перед самими данными. Не могу я менять алгоритм работы сервера, т.к. на нем крутятся терминалы ... |
|||
:
Нравится:
Не нравится:
|
|||
28.09.2018, 14:29 |
|
recv выход из цикла
|
|||
---|---|---|---|
#18+
Ну тогда ничего не поделаешь, придётся применять мозг или нанимать программиста. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
28.09.2018, 16:19 |
|
recv выход из цикла
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovНу тогда ничего не поделаешь, придётся применять мозг или нанимать программиста. Так где же взять этого программиста? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.09.2018, 16:24 |
|
recv выход из цикла
|
|||
---|---|---|---|
#18+
Локализовал проблему - при получении 2-х пакетов, теряется первый пакет, т.е. функция выдает к-то байт, но сам буфер пустой. Поставил Код: plaintext 1.
Не помогло. Есть подозрение, что буфере остается мусор от предыдущих запросов ... |
|||
:
Нравится:
Не нравится:
|
|||
28.09.2018, 16:56 |
|
recv выход из цикла
|
|||
---|---|---|---|
#18+
Sergey_rbпри получении 2-х пакетов, теряется первый пакет, т.е. функция выдает к-то байт, но сам буфер пустой. Что логично, поскольку ты и принимаешь в один буфер и складываешь в одно место, так что каждый следующий принятый кусок затирает предыдущий. Включи уже голову. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
28.09.2018, 17:42 |
|
recv выход из цикла
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovSergey_rbпри получении 2-х пакетов, теряется первый пакет, т.е. функция выдает к-то байт, но сам буфер пустой. Что логично, поскольку ты и принимаешь в один буфер и складываешь в одно место, так что каждый следующий принятый кусок затирает предыдущий. Включи уже голову. если речь идет о этой строке, авторtmp = cp1251toUtf8(rbuff,res); То я выложил не всю обработку Код: plaintext 1. 2.
Первый пакет теряется даже в случает двух вызовов recv Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29.
... |
|||
:
Нравится:
Не нравится:
|
|||
28.09.2018, 18:00 |
|
recv выход из цикла
|
|||
---|---|---|---|
#18+
Sergey_rbПервый пакет теряется даже в случает двух вызовов recv Это очередной псевдокод или этот бред реально написан в программе? Он в принципе не работоспособен от "strlen()" и ниже. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
28.09.2018, 18:16 |
|
|
start [/forum/topic.php?fid=57&startmsg=39709671&tid=2017750]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
37ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
47ms |
get tp. blocked users: |
1ms |
others: | 276ms |
total: | 404ms |
0 / 0 |