Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.09.03;
Скачать: [xml.tar.bz2];

Вниз

String To array of byte   Найти похожие ветки 

 
ex32Le   (2006-08-15 20:54) [0]

Имеем такую структуру:
 TRecvPacket = record
   RData: array[0..1024] of byte;
   RLen: Word;
 end;

В дальнейшем, принимаю данные из сокета как String:
procedure SZ2SocketOnData(Sender: TObject);
var
 tmp: TRecvPacket;
 tmprecv:string;
begin
 tmprecv := SZ2Socket.ReceiveStr;
 tmp.RLen := Length(tmprecv);
 Move(tmprecv[1],tmp.RData[0],length(tmprecv));
 HdlRecvData(tmp, length(tmprecv));
end;


HdlRecvData -- приблизительно такого вида:

procedure HdlRecvData(buffer: Pointer; bufferLen: LongWord);
....
В нем идет разбор пришедшего пакета.

В чем проблема? В HdlRecvData у меня проверяется валидность пакета, его разбор и т.д.
Но есть небольшая проблема, иногда при обработке пакетов, не проходит валидность, т.е. пакет не правильным образом доставляется от сокета до моей процедуры. Я бы копал конечно в сторону, как раз начинки HdlRecvData, НО, попробовал сделать вместо
 Move(tmprecv[1],tmp.RData[0],length(tmprecv));
 
На:
 for i := 0 to length(tmprecv) do
 tmp.RData[i] := ord(tmprecv[i+1]);


И всё работает без сбоев. Но мне не нравится такое рашение. Что посоветуете?


 
begin...end ©   (2006-08-15 21:06) [1]

После вызова Move добавьте строку tmp.RData[tmp.RLen] := 0. Сообщите результат.

Второй вариант приведённого кода, строго говоря, некорректен.


 
ex32Le   (2006-08-15 21:16) [2]


> После вызова Move добавьте строку tmp.RData[tmp.RLen] :=
> 0.


Увы, не помогло.


 
begin...end ©   (2006-08-15 21:24) [3]

Изменяется ли что-нибудь, если в Move вместо length(tmprecv) передавать length(tmprecv) + 1? В случае успеха это нельзя будет оставить в качестве конечного варианта, но всё же проверьте.


 
ex32Le   (2006-08-15 21:30) [4]


> length(tmprecv) + 1

Да, попробовал -- работает.


 
begin...end ©   (2006-08-15 21:40) [5]

ОК. Теперь после вызова Move (с учётом [3]) добавьте строчку ShowMessage(IntToStr(tmp.RData[tmp.RLen])) и выполните код несколько раз. Какое число показывает сообщение?


 
ex32Le   (2006-08-15 22:01) [6]

ShowMessage(IntToStr(tmp.RData[tmp.RLen]))
Возвращает (выводит) 0.


 
begin...end ©   (2006-08-15 22:09) [7]

> ex32Le   (15.08.06 22:01) [6]

Тогда [1], насколько я понимаю, должно работать. Вы действительно добавили строку из [1] сразу после вызова Move? Если всё-таки не работает, сравните (с помощью отладчика) содержимое массива tmp.RData (первые RLen+1 байт) непосредственно перед вызовом HdlRecvData в случаях [1] и [3].


 
ex32Le   (2006-08-15 22:20) [8]


> Вы действительно добавили строку из [1] сразу после вызова
> Move?

Да, сейчас для надежности снова проверил, но не помогло.

Сейчас работает корректно только при:

>   Move(tmprecv[1],t1.Data[0],length(tmprecv)+1);


Чуть позднее попробую сравнить массивы.


 
ex32Le   (2006-08-15 22:56) [9]

Наверное стоит немного оговорить ситуацию, дело в том что первые штук 10 пактов с сервера обрабатывались нормально, а потом приходит сразу 3-4 подряд с сервера, вот в этот - то момент всё и происходило, я понять не мог.

Вобщем сравнил я содержимое массивов, даже не знаю к какому выводу я пришел, но решил на всякий случай проверять длину пакета перед Move
if length(tmprecv) <= 0 then exit;
И как не странно, вроде всё стабилизировалось.


 
ex32Le   (2006-08-15 22:56) [10]

Наверное стоит немного оговорить ситуацию, дело в том что первые штук 10 пактов с сервера обрабатывались нормально, а потом приходит сразу 3-4 подряд с сервера, вот в этот - то момент всё и происходило, я понять не мог.

Вобщем сравнил я содержимое массивов, даже не знаю к какому выводу я пришел, но решил на всякий случай проверять длину пакета перед Move
if length(tmprecv) <= 0 then exit;
И как не странно, вроде всё стабилизировалось.


 
Германн ©   (2006-08-16 00:32) [11]


> Наверное стоит немного оговорить ситуацию, дело в том что
> первые штук 10 пактов с сервера обрабатывались нормально,
>  а потом приходит сразу 3-4 подряд с сервера, вот в этот
> - то момент всё и происходило, я понять не мог.

Может стоило подумать о том, что пакет принятый из сокета не обязан содержать целое число структур TRecvPacket? И организовать приёмный буфер, куда сваливать принятое, анализировать на "валидность" часть буфера, валидные куски после анализа копировать куда надо, удаляя при этом из буфера, а недопринятую информацию оставлять до будущих времён?



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2006.09.03;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.058 c
15-1154673710
Separator
2006-08-04 10:41
2006.09.03
Мелкий глюк форума


1-1153638445
Blacksus
2006-07-23 11:07
2006.09.03
Проблема с ShareMem


2-1155215797
MASTAFA
2006-08-10 17:16
2006.09.03
Проблема с компонентом TChart


15-1155274652
Карелин Артем
2006-08-11 09:37
2006.09.03
Как програмно записать в именованную ячейку Екселя?


3-1151071142
VALUA
2006-06-23 17:59
2006.09.03
Загрузка в Image1 рисунка из BLOB поля





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский