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

Вниз

Неправельный приём/передача данных   Найти похожие ветки 

 
Delpher_Gray ©   (2004-04-02 14:30) [0]

Така япроблема...
В программе сложные данные посылаются в обе стороны, и иногда бывают глюки...
Использую неблокирующиеся сокеты.

Сначала посылаю перфикс, содержащий парамерты:
1. Функция (что сделать с данными): integer
2. Размер данных идущих после префикса: integer

После посылки префикса посылаются сами данные, ну а после полного приёма программа решает что делать с принятыми данными, в зависимости от функции указанной в префиксе.

Вот и сам код приёма:

...

type
 TPrefix = packed record
   FuncCode: integer;
   DataSize: integer;
 end;
 PPrefix = ^TPrefix;

...

var
 PrefixReceive: boolean; // Режим приёма (префикс/данные)
 PrefixOffset: integer; // Сколько байт префикса ещё не приняли
 DataSize: integer; // Сколько байт данных ещё не приняли
 Buf: array[0..1024] of Byte; // Буфер
 MS: TMemoryStream; // Сюда записывается содержимое буффера

...

procedure TMain.ClientSocketRead(Sender: TObject;
 Socket: TCustomWinSocket);
var
 BytesRead: integer;
begin
 if PrefixReceive = true then
 begin
   BytesRead := Socket.ReceiveBuf(Buf[PrefixOffset], SizeOf(Prefix) - PrefixOffset);
   Inc(PrefixOffset, BytesRead);
   if PrefixOffset = SizeOf(Prefix) then
   begin
     DataSize := PPrefix(@Buf)^.DataSize;
     StreamSize := DataSize;
     Prefix.FuncCode := PPrefix(@Buf)^.FuncCode;  
     Prefix.DataSize := PPrefix(@Buf)^.DataSize;

     if DataSize > 0 then
       PrefixReceive := false // Если есть данные, то переводим программу в режим приёма данных
     else
       PrefixOffset := 0; // Если данных нет, то режим приёма префикса
   end;
 end else
 begin
   Application.ProcessMessages;
   BytesRead := Socket.ReceiveBuf(Buf, Min(DataSize, SizeOf(Buf)));
   MS.Write(Buf, BytesRead);

   Dec(DataSize, BytesRead);

   if DataSize = 0 then
   begin
     // Данные приняты - выполняем операции с MS

     MS.Clear;

     // Переводим сервер обратно в режим прёма префикса
     PrefixReceive := true;
     PrefixOffset := 0;
     StreamSize := 0;
   end;
 end;
end;


А вот и код отсылки данных:

...

var
 Prefix: TPrefix;

...

MS.LoadFromFile(...);
Prefix.FuncCode := 0;
Prefix.DataSize := MS.Size;

MS.Position := 0;

ClientSocket.Socket.SendBuf(Prefix, SizeOf(TPrefix));
ClientSocket.Socket.SendBuf(MS.Memory^, MS.Size);

...


Проблема заключается в том, что если я вызову несколько раз сразу (раз 5 в секунду) функцию передачи данных, то принемающий получит повреждённые данные !

В чём же дело !?

Заранее благодарен !


 
Verg ©   (2004-04-02 14:49) [1]


> Application.ProcessMessages;


Выкинь эту строчку.


> ClientSocket.Socket.SendBuf(Prefix, SizeOf(TPrefix));
> ClientSocket.Socket.SendBuf(MS.Memory^, MS.Size);


Так делать нельзя.

WSAEWOULDBLOCK и все такое.
Где анализ результата ф-ций передачи данных?!


 
Digitman ©   (2004-04-02 15:13) [2]

чудовищно

у меня уже язык отсох долдонить одно и то же


 
Delpher_Gray ©   (2004-04-02 15:43) [3]

Переделал код так:
 Send := ClientSocket.Socket.SendBuf(MS.Memory^, MS.Size);
 while Send < SizeOf(MS.Size) do
   Application.ProcessMessages;


Но всё равно ошибки !
Люди подскажите пожалуйста как переделать код, чтоб неглючило !?


 
Delpher_Gray ©   (2004-04-02 15:43) [4]

Сорри, в коде оишибка ! Не SizeOf(MS.Size), а MS.Size


 
Verg ©   (2004-04-02 15:51) [5]


> Delpher_Gray ©   (02.04.04 15:43) [3]
> Переделал код так:
>  Send := ClientSocket.Socket.SendBuf(MS.Memory^, MS.Size);
>  while Send < SizeOf(MS.Size) do
>    Application.ProcessMessages;


Ты чего делаешь?! Опомнись!


 
Digitman ©   (2004-04-02 15:52) [6]

ты не понимаешь что ли ? тебе уже сказали - ВЫКИНЬ Application.ProcessMessages из своего текста ! и цикл выкинь !

ClientSocket.Socket.SendStream(MS);

все !!

и раньше чем получишь событие OnWrite даже и не дергайся что-либо еще посылать !


 
Delpher_Gray ©   (2004-04-02 16:01) [7]

Application.ProcessMessages - обязательно выкидывать!?
Просто когда получаю файл, программы подвисает :(

А событие OnWrite у меня возникает только один раз после подключения ! Должно же поидеи возникать каждый раз после посылки данных !?


 
Digitman ©   (2004-04-02 16:11) [8]


> Должно же поидеи


по какой такой "поидеи" ?! ты в состоянии хелп внимательно перечитать ? ты в состоянии проанализировать исх.текст компонента, благо он прямо перед носом у тебя ? ты в состоянии, прежде чем браться за отнюдь нетривиальную задачу, посетить http://book.itep.ru/7/sock_71.htm и проштудировать от корки до корки, прежде чем метаться ?


 
Delpher_Gray ©   (2004-04-02 20:49) [9]

Уже начал читать...
Всё равно ты подскажи на конктерном примере как исплавить глюки то !? А там с помошью статьи я уже догонюсь что и как...


 
Delpher_Gray ©   (2004-04-03 11:07) [10]

Люди ау ! Помогите решить пролему...



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

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

Наверх




Память: 0.48 MB
Время: 0.046 c
3-1083244047
GEN
2004-04-29 17:07
2004.05.23
БД Access, проблема переноса на другую машину


14-1083547372
MPS
2004-05-03 05:22
2004.05.23
Задачка по информатике...


9-1074623507
Black Fury
2004-01-20 21:31
2004.05.23
Как создать новую поверхность?


3-1083156599
Санёк
2004-04-28 16:49
2004.05.23
Чтение данных с MS SQL блоками


8-1078786855
ПсихЪ
2004-03-09 02:00
2004.05.23
TDirectDrawSurface из DelphiX





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский