Ответ: Непонятки с TCP/IP
Все что я хотел услышать, сказал MoKa. TCPlength тоже логировалось, но раньше, потом убрал за ненадобностью. Когда пропадает те самые 4 байта, тогда TCPlength принимает значение первых 4-х байт тела самого сообщения - а первые 4 байта - символы, то есть если их перевести в integer, получится всегда больше 1000, на что и стояла последующая проверка. Я об этом уже писал.
Ты сталкивался что пропадают конкретные 4 байта сообщения? Причем их нет в предыдущем сообщении, и нет нигде - просто не пришли, как будто их и не отправляли. Это не те случаи, когда пришло еще не все, что должно было, и не те, когда сообщение читается неправильно. Это конкретный, очень специфический случай... На самом деле, в данном случае надо написать кусок клиента на пурике, и посмотреть как он будет себя вести. Ну уж если не выйдет из меня программиста, то все - пойду повешусь на люстре, смысла жизни нет:( п.с. за старание помочь конечно спасибо, но по-моему, мы просто неправильно друг друга понимаем... |
Ответ: Непонятки с TCP/IP
Цитата:
|
Ответ: Непонятки с TCP/IP
Сразу отвечаю, не читаю.
Ты проверяешь длину буффера так? А буффер уже создан давно, и ты лишь записываешь в него прочтённые данные так? Значит длина у него не будет соответствовать на самом деле длине принятых данных. Плюс ты вроди как переиспользуешь буффер для приёма заголовка (4 байта) и затем в него же читаешь само сообщение, так? Получается что в определённом сценарии, при попытки прочитать 4 байта заголовок, ничего не было прочитано, и в буфере будет 4 байта с прошлого буффера сообщения. Если я ничего не упустил - это твоя проблема описана выше. Она заключается в правильной проверке принятых данных и корректной реакции на не соответствия. |
Ответ: Непонятки с TCP/IP
чтение происходит только если новые данные пришли - то есть прошлый буффер, хоть он там и остается, никак не может быть еще раз прочитан, на него хоть один байт, но записывается, и это видно в логах.
еще раз код: Код:
ReceiveNetworkData(TCPclientID, *TCPBuffer,4) То что закоменчено, это как раз было логирование пришедших данных. И в случае ошибки в переменной temp было как раз начало следующего пакета, а должна быть по идее длина пакета - integer. |
Ответ: Непонятки с TCP/IP
Ты считаешь длину буффера а не принятых данных.
Длина принятых данных - это число возвращаемое функцией ReceiveNetworkData. http://www.purebasic.com/documentati...tworkdata.html |
Ответ: Непонятки с TCP/IP
эмм, я тут вообще длину не считаю:) длина принимается от клиента - 4 байта integer...
|
Ответ: Непонятки с TCP/IP
Длина не сообщения, а длина принятых не сервере данных при использовании функции ReceiveNetworkData.
|
Ответ: Непонятки с TCP/IP
Да знаю я что это функция возвращает, хелп читал, примеры других прог смотрел:) но в данном случае эта длина мне не нужна - предпологается что пакеты приходят в одном и том же формате. Следующая после этого функция уже парсит считанные данные - и если они не подходят под формат просто пропускаются. В принципе от нужного клиента данные в другом формате и не приходят, так что тут все пучком))
|
Ответ: Непонятки с TCP/IP
Смотри.
Ты читаешь заголовок 4 байта в буффер. Затем в этот же буффер ты читаешь само сообщение по длине из заголовка. Вроди всё ок. Далее следующий раз читаешь ещё один заголовок 4 байта, и функция ReceiveNetworkData возвращает 0 т.к. по каким-то обстаятельствам не прочла данные, следственно не трогает сам буффер с данными. А ты не проверил это, и сразу переходишь к получению числа из ожидаемых данных заголовка, а это на самом деле прошлые данные (с прошлого сообщения), следственно и длина будет не верная. Так понятнее? С самого начала, я и Пётр говорили именно об этой проверке, не самого буффера с данными, а того сколько принялось данных функцией ReceiveNetworkData. |
Ответ: Непонятки с TCP/IP
Не возвращает она ноль, если она возвратила 0, значит данных нет для чтения. А эта процедура вызывается только если есть данные. Вот так - тут ошибки тоже нет.
Кстати где закоменчено там - вывод в консоль и str и int из этих 4 байт, всегда показывал начало следующего пакета, ни разу предыдущего. |
Часовой пояс GMT +4, время: 11:49. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot