![]() |
Ответ: Непонятки с TCP/IP
Цитата:
|
Ответ: Непонятки с TCP/IP
Пакетный? TCP насколько я помню - непрерывный поток данных, не подразделяющийся на пакеты. Пакетами в данном случае я называю отдельные сообщения в TCP потоке... Как я писал выше оба способа дают одинаковый результат.
|
Ответ: Непонятки с TCP/IP
TCP - это поток данных. Протокол может разбивать данные на сегменты, либо наоборот на уровне протокола в системе ждать пока не будет достаточно данных для полного сегмента (Нагглэ Алгоритм).
Тут дело не с протоколом, а с блицем, и не тем как он кладёт всё в кучу или наоборот, а в том что видимо число порой не отправляется последовательно. Блиц старик, и я бы не юзал стандартный функционал для сети (снова). |
Ответ: Непонятки с TCP/IP
доверяй wireshark-у юный падаван
советы его мудры, око его всевидяще и да прибудет с тобой сила |
Ответ: Непонятки с TCP/IP
Цитата:
Я что-то не очень понял. Разделители типа EOL между строками никуда не денутся. А дейтаграммы и на уровне движка, и на уровне tcp всегда стремятся склеится (лучше отправить 1 раз 500 байт, чем два раза по 250). Функции запроса конкретного типа данных (типа ReadLine) очевидно работают в блокирующем режиме (дожидаясь приёма объекта целиком) с крахом по таймауту, задаваемому функцией TCPTimeouts. тред не читал @ сразу овтечал |
Ответ: Непонятки с TCP/IP
Цитата:
Где гарантия что первый вызов ReceiveNetworkData() запишет в буфер именно 4 байта? А если пришло только, скажем, 2 байта, что тогда? Где гарантия что второй вызов функции, поместить в буфер именно столько байт, сколько указанно в TCPlength? Может на момент чтения еще не все данные пришли, вот и будет выше описанный баг. Если хотите чтобы все работало без сбоев, делайте следующим образом: Заведите буфер, размером в несколько раз больше чем максимальный размер пакета. Читайте данные в этот буфер и анализируйте сколько байт реально было прочитано функцией ReceiveNetworkData(). Если меньше положенного, то ждите и через время опять читайте, помещая результат в конец буфера. Как только приняли все данные, тогда обрабатываете. Буфер очищаете и опять в него пишите принимаемые данные. |
Ответ: Непонятки с TCP/IP
Плин, опять... Как я уже выше писал - еще нет проверки на неполность пакета. Тем не менее, он всегда работает как надо! За последние два месяца это было проверено несколько десятков тысяч раз.
Цитата:
Прежде чем отвечать, внимательно прочитайте предыдущие сообщения в треде. Спасибо. |
Ответ: Непонятки с TCP/IP
Ну смотрите дело ваше.
Я сталкивался с подобным и выше описал как решил проблему. В таком варианте как сейчас, есть вероятность глюков из-за приема не всех данных пакета. |
Ответ: Непонятки с TCP/IP
Кстати, вот один из сценариев пропадания первых 4-ёх байт пакета.
Пакеты отправляются друг за другом и возникает такая ситуация что первые 4 байта нового пакета принимаются с предыдущим пакетом. Как бороться с этим, описал выше. |
Ответ: Непонятки с TCP/IP
это я тоже проверял, пакет принимается ровно столько, сколько нужно - лишнее не захватывает. А вот как 4 байта эти пропадают, тогда уже прога не знает сколько байт считать и получается может захватить последующие пакеты...
|
Ответ: Непонятки с TCP/IP
Цитата:
|
Ответ: Непонятки с TCP/IP
логи отправленных и принятых данных, сравнивал, анализировал;)
Я уже в этом треде раз 5 написал, что код работает абсолютно нормально. Но очень редко и рандомно пропадают именно 4 байта, других ошибок и багов никогда не было. Пётр, извини конечно, но внимательнее читай тему... |
Ответ: Непонятки с TCP/IP
Цитата:
Ну или как альтернатива, гадание на кофейной гуще, раз кода нет. Цитата:
Кому нужно избавится от глюков в проге, мне или тебе? Я тебе уже несколько раз писал чтобы проверял сколько реально было прочитано байт, но видимо ты невнимательно читаешь. |
Ответ: Непонятки с TCP/IP
Код:
PrintN(TCPPacket) Ты мне не веришь что других ошибок не возникало, кроме пропажи integer`а. Ну извини, логи у меня выводятся в консоль, и я их не сохраняю. Предпологалось, что последнее сообщение было на первой странице треда, где я поблагодарил MoKa. Глюков в программе нет, единственное что нужно проверку на неполность сообщения, но это я и сразу знал, и писал об этом. Подправил кстати TCPPacket=PeekS(*TCPBuffer,TCPlength) строчку в коде на первой странице, на прием никак не влияет, но в стринг TCPPacket могут записатся куски старых пакетов из буффера, так как он не очищается... Закрыть бы темку, а то ничего кроме срача тут не предвидится... |
Ответ: Непонятки с TCP/IP
Цитата:
Код:
RealCountBytes_1 = ReceiveNetworkData(TCPclientID,*TCPBuffer,4) Цитата:
Не выйдет из тебя программиста. Нет логического мышления и не слушаешь тех, кто старается тебе помочь! |
Часовой пояс GMT +4, время: 06:59. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot