|
NetworkStream.Read как читать кусками?
|
|||
---|---|---|---|
#18+
Как читать кусками и вернуть в конце массив байтов? Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2015, 13:30 |
|
NetworkStream.Read как читать кусками?
|
|||
---|---|---|---|
#18+
Winnipuh, 1) Не нужно постоянно делать tcpClient.GetStream(). Достаточно один раз получить его. 2) do while - неправильно. Потому что при первой итерации DataAvailible может быть и false. И вообще - странный маркер окончания данных. Я бы сказал, что это вообще не маркер. 3) по сути вопроса: пишем все считанные куски в MemoryStream и в конце пользуемся ToArray ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2015, 13:46 |
|
NetworkStream.Read как читать кусками?
|
|||
---|---|---|---|
#18+
Arm79Winnipuh, 1) Не нужно постоянно делать tcpClient.GetStream(). Достаточно один раз получить его. 2) do while - неправильно. Потому что при первой итерации DataAvailible может быть и false. И вообще - странный маркер окончания данных. Я бы сказал, что это вообще не маркер. 3) по сути вопроса: пишем все считанные куски в MemoryStream и в конце пользуемся ToArray Так сделал, исходя из примера Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2015, 14:00 |
|
NetworkStream.Read как читать кусками?
|
|||
---|---|---|---|
#18+
не, все-таки предыдущий вариант неправильный, после нескольких чтений стримов что-то криво, вернул do-while, так работает. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2015, 14:16 |
|
NetworkStream.Read как читать кусками?
|
|||
---|---|---|---|
#18+
Arm79Потому что при первой итерации DataAvailible может быть и false. Может быть и не при первой - при том, что отдающая сторона продолжает заливать данные. Флуктуации сетевой передачи, и типа всё такое. Нужно проверять DataAvailable в цикле на протяжении определенного таймаута. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2015, 14:27 |
|
NetworkStream.Read как читать кусками?
|
|||
---|---|---|---|
#18+
Сон Веры ПавловныArm79Потому что при первой итерации DataAvailible может быть и false. Может быть и не при первой - при том, что отдающая сторона продолжает заливать данные. Флуктуации сетевой передачи, и типа всё такое. Нужно проверять DataAvailable в цикле на протяжении определенного таймаута. Ну да, я и не спорю. Проверять нужно в цикле. WinnipuhArm79Winnipuh, 1) Не нужно постоянно делать tcpClient.GetStream(). Достаточно один раз получить его. 2) do while - неправильно. Потому что при первой итерации DataAvailible может быть и false. И вообще - странный маркер окончания данных. Я бы сказал, что это вообще не маркер. 3) по сути вопроса: пишем все считанные куски в MemoryStream и в конце пользуемся ToArray Так сделал, исходя из примера Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
Неправильно. Для начала определитесь, что считать окончанием передачи. Флаг DataAvailible лишь показывает, существуют ли на момент опроса доступные данные, не более того. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2015, 15:01 |
|
NetworkStream.Read как читать кусками?
|
|||
---|---|---|---|
#18+
как определиться? пока есть данные я читаю. Если будет false - не читаю, а что делать ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2015, 15:04 |
|
NetworkStream.Read как читать кусками?
|
|||
---|---|---|---|
#18+
Winnipuhкак определиться? пока есть данные я читаю. Если будет false - не читаю, а что делать Пример: Вы знаете, что получаете строку длиной 1000 байт. Но в вашем цикле получили только 600 и DataAvailable равен false. Нужно ли прекращать обработку? Очевидно, что нет. В данном случае маркером окончания передачи является получение 1000 байтов. Грубо получится так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2015, 16:20 |
|
NetworkStream.Read как читать кусками?
|
|||
---|---|---|---|
#18+
TcpClient - кривой. если передающая сторона закроет сокет, DataAvailable - вернёт false, при этом Read вернёт 0 ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2015, 16:45 |
|
NetworkStream.Read как читать кусками?
|
|||
---|---|---|---|
#18+
ИзопропилTcpClient - кривой. если передающая сторона закроет сокет, DataAvailable - вернёт false, при этом Read вернёт 0 Да, на больших ответах видно, что кривой, читает какими-то неопределнными кусками. Наверняка и сервер отдает как хочет, но чтение идет кусками. Так что делать, как правильно читать? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2015, 17:23 |
|
NetworkStream.Read как читать кусками?
|
|||
---|---|---|---|
#18+
WinnipuhТак что делать, как правильно читать? из самих данных - можешь длину определить? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2015, 17:30 |
|
NetworkStream.Read как читать кусками?
|
|||
---|---|---|---|
#18+
WinnipuhТак что делать, как правильно читать? Я честно говоря не понимаю, в чем проблема моих объяснений? Если вы знаете, что за данные вам сыпятся, то должны знать как отличать один пакет от другого. Существует 2 популярных пути - один заключается в предварительной передаче длины последующего сообщения. Второй - по окончании пакета данных передается какой то маркер. Например, для POP3 протокола маркером окончания однострочного ответа на команду являются \r\n Для протокола FIX там жесткая комбинация из длины вначале, и контрольных сумм в конце. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2015, 17:44 |
|
NetworkStream.Read как читать кусками?
|
|||
---|---|---|---|
#18+
Arm79WinnipuhТак что делать, как правильно читать? Я честно говоря не понимаю, в чем проблема моих объяснений? Если вы знаете, что за данные вам сыпятся, то должны знать как отличать один пакет от другого. Существует 2 популярных пути - один заключается в предварительной передаче длины последующего сообщения. Второй - по окончании пакета данных передается какой то маркер. Например, для POP3 протокола маркером окончания однострочного ответа на команду являются \r\n Для протокола FIX там жесткая комбинация из длины вначале, и контрольных сумм в конце. Мопед Сервер не мой. Я читаю из Redis, у них протокол открыт. Я ваш подход использовал, делаю спячку по 1-2 мс, работает правильно на больших данных. Длину в принципе можно узнать, она идет вначале. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2015, 18:16 |
|
NetworkStream.Read как читать кусками?
|
|||
---|---|---|---|
#18+
WinnipuhДлину в принципе можно узнать, она идет вначале. не в принципе а в корпусе нужно знать. соединение может закрыться преждевременно - потерю данных - не отследить будет ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2015, 18:20 |
|
NetworkStream.Read как читать кусками?
|
|||
---|---|---|---|
#18+
ИзопропилWinnipuhДлину в принципе можно узнать, она идет вначале. не в принципе а в корпусе нужно знать. соединение может закрыться преждевременно - потерю данных - не отследить будет Если есть данные то они идут так Код: c# 1. 2. 3.
то есть - данные далее и длина их такая. Далее можно дочитывать. Но, если этот кусок оборвётся, тогда п-ц, разве что дотягивать до признака \r\n ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2015, 18:28 |
|
NetworkStream.Read как читать кусками?
|
|||
---|---|---|---|
#18+
Winnipuh, ждать в течение таймаута, если не дождался - повторять запрос, или не повторять ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2015, 18:33 |
|
NetworkStream.Read как читать кусками?
|
|||
---|---|---|---|
#18+
WinnipuhНо, если этот кусок оборвётся, тогда п-ц, разве что дотягивать до признака \r\n сюр какой-то. Если не удалось прочитать длину - значит закрыть соединение и всё сначала ("длина" ещё 0 и -1 бывает) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2015, 18:34 |
|
|
start [/forum/topic.php?fid=20&fpage=81&tid=1401369]: |
0ms |
get settings: |
13ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
33ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
57ms |
get tp. blocked users: |
2ms |
others: | 356ms |
total: | 499ms |
0 / 0 |