Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   www.boolean.name > Программирование игр для компьютеров > PureBasic

PureBasic Мощный кросс-платформенный язык среднего уровня на основе BASIC. Подходит для решения широкого круга задач.

Ответ
 
Опции темы
Старый 20.07.2012, 12:05   #31
DStalk
Разработчик
 
Аватар для DStalk
 
Регистрация: 26.06.2009
Адрес: Рязань-Москва
Сообщений: 462
Написано 391 полезных сообщений
(для 1,052 пользователей)
Ответ: Непонятки с TCP/IP

Все что я хотел услышать, сказал MoKa. TCPlength тоже логировалось, но раньше, потом убрал за ненадобностью. Когда пропадает те самые 4 байта, тогда TCPlength принимает значение первых 4-х байт тела самого сообщения - а первые 4 байта - символы, то есть если их перевести в integer, получится всегда больше 1000, на что и стояла последующая проверка. Я об этом уже писал.

Ты сталкивался что пропадают конкретные 4 байта сообщения? Причем их нет в предыдущем сообщении, и нет нигде - просто не пришли, как будто их и не отправляли. Это не те случаи, когда пришло еще не все, что должно было, и не те, когда сообщение читается неправильно. Это конкретный, очень специфический случай...

На самом деле, в данном случае надо написать кусок клиента на пурике, и посмотреть как он будет себя вести.

Ну уж если не выйдет из меня программиста, то все - пойду повешусь на люстре, смысла жизни нет

п.с. за старание помочь конечно спасибо, но по-моему, мы просто неправильно друг друга понимаем...
__________________
galaxies.su | dstalk.ru
(Offline)
 
Ответить с цитированием
Старый 20.07.2012, 12:16   #32
DStalk
Разработчик
 
Аватар для DStalk
 
Регистрация: 26.06.2009
Адрес: Рязань-Москва
Сообщений: 462
Написано 391 полезных сообщений
(для 1,052 пользователей)
Ответ: Непонятки с TCP/IP

Сообщение от Dstalk Посмотреть сообщение
Ну уж если не выйдет из меня программиста, то все - пойду повешусь на люстре, смысла жизни нет
И винить в этом буду тебя По ночам являться буду
__________________
galaxies.su | dstalk.ru
(Offline)
 
Ответить с цитированием
Старый 20.07.2012, 13:45   #33
moka
.
 
Регистрация: 04.08.2006
Сообщений: 10,429
Написано 3,453 полезных сообщений
(для 6,859 пользователей)
Ответ: Непонятки с TCP/IP

Сразу отвечаю, не читаю.

Ты проверяешь длину буффера так? А буффер уже создан давно, и ты лишь записываешь в него прочтённые данные так? Значит длина у него не будет соответствовать на самом деле длине принятых данных.
Плюс ты вроди как переиспользуешь буффер для приёма заголовка (4 байта) и затем в него же читаешь само сообщение, так?
Получается что в определённом сценарии, при попытки прочитать 4 байта заголовок, ничего не было прочитано, и в буфере будет 4 байта с прошлого буффера сообщения.
Если я ничего не упустил - это твоя проблема описана выше.
Она заключается в правильной проверке принятых данных и корректной реакции на не соответствия.
(Offline)
 
Ответить с цитированием
Старый 20.07.2012, 14:12   #34
DStalk
Разработчик
 
Аватар для DStalk
 
Регистрация: 26.06.2009
Адрес: Рязань-Москва
Сообщений: 462
Написано 391 полезных сообщений
(для 1,052 пользователей)
Ответ: Непонятки с TCP/IP

чтение происходит только если новые данные пришли - то есть прошлый буффер, хоть он там и остается, никак не может быть еще раз прочитан, на него хоть один байт, но записывается, и это видно в логах.

еще раз код:
ReceiveNetworkData(TCPclientID, *TCPBuffer,4)
TCPlength.i=PeekL(*TCPBuffer)
;temp.s=PeekS(*TCPBuffer,4)
;PrintN("Packet Length:"+Str(TCPlength)+"   "+temp)
;If TCPlength>1000:TCPlength=1000:PrintN("Packet error!"):EndIf
ReceiveNetworkData(TCPclientID, *TCPBuffer,TCPlength)
TCPPacket=PeekS(*TCPBuffer,TCPlength)
;PrintN(TCPPacket)
Я не считал полную длину именно считанных данных, как прелагал Пётр. Но все пришедшие пакеты полностью видны в консольке, соответственно можно посмотреть, где пакет "недочитался", где слишком много, что не пришло.

То что закоменчено, это как раз было логирование пришедших данных. И в случае ошибки в переменной temp было как раз начало следующего пакета, а должна быть по идее длина пакета - integer.
__________________
galaxies.su | dstalk.ru
(Offline)
 
Ответить с цитированием
Старый 20.07.2012, 14:21   #35
moka
.
 
Регистрация: 04.08.2006
Сообщений: 10,429
Написано 3,453 полезных сообщений
(для 6,859 пользователей)
Ответ: Непонятки с TCP/IP

Ты считаешь длину буффера а не принятых данных.
Длина принятых данных - это число возвращаемое функцией ReceiveNetworkData.
http://www.purebasic.com/documentati...tworkdata.html
(Offline)
 
Ответить с цитированием
Старый 20.07.2012, 14:27   #36
DStalk
Разработчик
 
Аватар для DStalk
 
Регистрация: 26.06.2009
Адрес: Рязань-Москва
Сообщений: 462
Написано 391 полезных сообщений
(для 1,052 пользователей)
Ответ: Непонятки с TCP/IP

эмм, я тут вообще длину не считаю длина принимается от клиента - 4 байта integer...
__________________
galaxies.su | dstalk.ru
(Offline)
 
Ответить с цитированием
Старый 20.07.2012, 18:34   #37
moka
.
 
Регистрация: 04.08.2006
Сообщений: 10,429
Написано 3,453 полезных сообщений
(для 6,859 пользователей)
Ответ: Непонятки с TCP/IP

Длина не сообщения, а длина принятых не сервере данных при использовании функции ReceiveNetworkData.
(Offline)
 
Ответить с цитированием
Старый 20.07.2012, 18:55   #38
DStalk
Разработчик
 
Аватар для DStalk
 
Регистрация: 26.06.2009
Адрес: Рязань-Москва
Сообщений: 462
Написано 391 полезных сообщений
(для 1,052 пользователей)
Ответ: Непонятки с TCP/IP

Да знаю я что это функция возвращает, хелп читал, примеры других прог смотрел но в данном случае эта длина мне не нужна - предпологается что пакеты приходят в одном и том же формате. Следующая после этого функция уже парсит считанные данные - и если они не подходят под формат просто пропускаются. В принципе от нужного клиента данные в другом формате и не приходят, так что тут все пучком))
__________________
galaxies.su | dstalk.ru
(Offline)
 
Ответить с цитированием
Старый 20.07.2012, 19:08   #39
moka
.
 
Регистрация: 04.08.2006
Сообщений: 10,429
Написано 3,453 полезных сообщений
(для 6,859 пользователей)
Ответ: Непонятки с TCP/IP

Смотри.

Ты читаешь заголовок 4 байта в буффер. Затем в этот же буффер ты читаешь само сообщение по длине из заголовка. Вроди всё ок.
Далее следующий раз читаешь ещё один заголовок 4 байта, и функция ReceiveNetworkData возвращает 0 т.к. по каким-то обстаятельствам не прочла данные, следственно не трогает сам буффер с данными. А ты не проверил это, и сразу переходишь к получению числа из ожидаемых данных заголовка, а это на самом деле прошлые данные (с прошлого сообщения), следственно и длина будет не верная.
Так понятнее?

С самого начала, я и Пётр говорили именно об этой проверке, не самого буффера с данными, а того сколько принялось данных функцией ReceiveNetworkData.
(Offline)
 
Ответить с цитированием
Старый 20.07.2012, 19:25   #40
DStalk
Разработчик
 
Аватар для DStalk
 
Регистрация: 26.06.2009
Адрес: Рязань-Москва
Сообщений: 462
Написано 391 полезных сообщений
(для 1,052 пользователей)
Ответ: Непонятки с TCP/IP

Не возвращает она ноль, если она возвратила 0, значит данных нет для чтения. А эта процедура вызывается только если есть данные. Вот так - тут ошибки тоже нет.

Кстати где закоменчено там - вывод в консоль и str и int из этих 4 байт, всегда показывал начало следующего пакета, ни разу предыдущего.
__________________
galaxies.su | dstalk.ru
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +1, время: 20:50.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com