forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   PureBasic (http://forum.boolean.name/forumdisplay.php?f=90)
-   -   Непонятки с TCP/IP (http://forum.boolean.name/showthread.php?t=17047)

DStalk 20.07.2012 16:05

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

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

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

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

п.с. за старание помочь конечно спасибо, но по-моему, мы просто неправильно друг друга понимаем...

DStalk 20.07.2012 16:16

Ответ: Непонятки с TCP/IP
 
Цитата:

Сообщение от Dstalk (Сообщение 233478)
Ну уж если не выйдет из меня программиста, то все - пойду повешусь на люстре, смысла жизни нет:(

И винить в этом буду тебя:) По ночам являться буду>>:(

moka 20.07.2012 17:45

Ответ: Непонятки с TCP/IP
 
Сразу отвечаю, не читаю.

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

DStalk 20.07.2012 18:12

Ответ: Непонятки с 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.

moka 20.07.2012 18:21

Ответ: Непонятки с TCP/IP
 
Ты считаешь длину буффера а не принятых данных.
Длина принятых данных - это число возвращаемое функцией ReceiveNetworkData.
http://www.purebasic.com/documentati...tworkdata.html

DStalk 20.07.2012 18:27

Ответ: Непонятки с TCP/IP
 
эмм, я тут вообще длину не считаю:) длина принимается от клиента - 4 байта integer...

moka 20.07.2012 22:34

Ответ: Непонятки с TCP/IP
 
Длина не сообщения, а длина принятых не сервере данных при использовании функции ReceiveNetworkData.

DStalk 20.07.2012 22:55

Ответ: Непонятки с TCP/IP
 
Да знаю я что это функция возвращает, хелп читал, примеры других прог смотрел:) но в данном случае эта длина мне не нужна - предпологается что пакеты приходят в одном и том же формате. Следующая после этого функция уже парсит считанные данные - и если они не подходят под формат просто пропускаются. В принципе от нужного клиента данные в другом формате и не приходят, так что тут все пучком))

moka 20.07.2012 23:08

Ответ: Непонятки с TCP/IP
 
Смотри.

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

С самого начала, я и Пётр говорили именно об этой проверке, не самого буффера с данными, а того сколько принялось данных функцией ReceiveNetworkData.

DStalk 20.07.2012 23:25

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

Кстати где закоменчено там - вывод в консоль и str и int из этих 4 байт, всегда показывал начало следующего пакета, ни разу предыдущего.


Часовой пояс GMT +4, время: 11:49.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot