Модераторы: Snowy, Poseidon, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема связанная с TClientSocked и TServerSocked, происходит смешивание посланий 
V
    Опции темы
Ak47black
  Дата 25.4.2007, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

Репутация: нет
Всего: 0



Здраствуйте.
Вообшем у меня проблема с использованием TClientSocked и TServerSocked.
Даж незнаю с чего начать, попробую объяснить поподробней(как смогу)
Проблема:
    Если отправлять большие куски данных(пакеты) и очень быстро то у меня происходит смешивание их и получаеться  ‘Каша’  smile 
    Тоесть данные приходят сразу от двоих посланий.
    Отследить немогу потомучто незнаю по сколько они обрываються и очень трудно проследить вообше.
user posted image
    Как с этим бороться  smile ?


Это сообщение отредактировал(а) Ak47black - 25.4.2007, 21:03
PM MAIL   Вверх
AugMaster
Дата 25.4.2007, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 3.8.2006

Репутация: 1
Всего: 1



"каша" имеется ввиду что они склеиваются ? или то что часть пакета теряется ? поподробнее плиз
PM MAIL   Вверх
MetalFan
Дата 26.4.2007, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 14
Всего: 128



а как у тебя получается послать второй кусок, недоконца отправив первый?
1) пример кода клиента
2) пример кода сервера, при котором наблюдается данная проблема

Это сообщение отредактировал(а) MetalFan - 26.4.2007, 10:54


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Ak47black
Дата 26.4.2007, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

Репутация: нет
Всего: 0



Незнаю может нето чтото, но скорей всего изза того что смешиваються, хотя незнаю может я и обсурд говорю
(весь немогу выложить слишком большой)

Вообшем вот мой 'велосипедный' модуль осушествляюший пересылку
Код

unit TransferParser;

interface

uses
  Base64, CryptionMod, Dialogs, SysUtils, Classes;

type
  TTransferChunk = record
    param: array of string;
  end;

function Outpacked(OutText: TTransferChunk): string;
function Inpacked(ReceivedText: string): TTransferChunk;

implementation

var
  LastNotCompleted: Boolean;
  TempTransfered: TTransferChunk;

function Inpacked(ReceivedText: string): TTransferChunk;
var
  i: Integer;
  HasStart: Boolean;
  HasEnd: Boolean;
begin
  HasStart:= False;
  HasEnd:= False;

  if pos('<',ReceivedText)<>0 then
  begin
    HasStart:= True;
    Delete(ReceivedText,1,1);
  end;

  if pos('>',ReceivedText)<>0 then
  begin
    HasEnd:= True;
    Delete(ReceivedText,Length(ReceivedText),1);
  end;

  if HasStart then SetLength(TempTransfered.param,0);

  if LastNotCompleted then
  begin
    if (pos('|',ReceivedText)<>0) then
    begin
       //Тут бывает вот эиа ошибка изза того что TempTransfered.param= nil
      begin
        TempTransfered.param[Length(TempTransfered.param)-1]:= Decode(TempTransfered.param[Length(TempTransfered.param)-1]+Copy(ReceivedText,1,pos('|',ReceivedText)-1));
        Delete(ReceivedText,1,pos('|',ReceivedText));
        LastNotCompleted:= False;
      end;
    end
    else
    begin
      TempTransfered.param[Length(TempTransfered.param)-1]:= TempTransfered.param[Length(TempTransfered.param)-1]+ReceivedText;
      ReceivedText:= '';
    end;
  end;

  while (pos('|',ReceivedText)<>0) do
  begin
    SetLength(TempTransfered.param,Length(TempTransfered.param)+1);
    TempTransfered.param[Length(TempTransfered.param)-1]:= Decode(Copy(ReceivedText,1,pos('|',ReceivedText)-1));
    Delete(ReceivedText,1,pos('|',ReceivedText));
  end;

  if (ReceivedText<>'') then
  begin
    SetLength(TempTransfered.param,Length(TempTransfered.param)+1);
    TempTransfered.param[Length(TempTransfered.param)-1]:= ReceivedText;
    ReceivedText:= '';
    LastNotCompleted:= True;
  end;

  if HasEnd then
  begin
    Result:= TempTransfered;
    SetLength(TempTransfered.param,0);
  end
    else SetLength(Result.param,0);

end;

function Outpacked(OutText: TTransferChunk): string;
var
  i: integer;
  Sendtext: String;
  s1,s2:pChar;
begin
  for i:=0 to Length(OutText.param)-1 do
  begin
    Sendtext:= Sendtext+Encode(OutText.param[i])+'|';
  end;
  Result:= '<'+Sendtext+'>';
end;


Посылаю например вот так 
Код

var
  pack: TTransferChunk;
begin
  SetLength(pack.param,6);
  pack.param[0]:= '$SearchFoundItem';
  pack.param[1]:= Location;
  pack.param[2]:= IntToStr(Size);
  pack.param[3]:= FileType;
  pack.param[4]:= ModifiedDate;
  pack.param[5]:= ComponentToString(SmallIcon);
  try
    Socket.SendText(Outpacked(pack));
  except
  end;
end;


Принимаю
Код

Inpacked(ReceiveText)


При очень быстой посылке данные очень редко но иногда неприходят корректно :(

Это сообщение отредактировал(а) Ak47black - 26.4.2007, 13:00
PM MAIL   Вверх
MetalFan
Дата 26.4.2007, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 14
Всего: 128



ну это нормально...
проверяй функцию Outpacket... в ней есть очень нехоршая ошибка...
найдешь - молодец)
подсказка - что обычно содержат неинициализированные локальные переменные?


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Ak47black
Дата 26.4.2007, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

Репутация: нет
Всего: 0



MetalFan, я наверно нашол, хотя ммм... может и нето
Я думаю 
Код

Sendtext:= '';

Надо  smile 
PM MAIL   Вверх
Ak47black
Дата 26.4.2007, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

Репутация: нет
Всего: 0



Там нетолко изза этого.
Вообшем если есть какинибудь мнения то пишите.
PM MAIL   Вверх
Ak47black
Дата 26.4.2007, 19:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

Репутация: нет
Всего: 0



Тут что с Сокетами.
Лан проведем эксперент, я приклепляю сам пероект эксперемента   smile (исходники внутри) .
Вот кто скачает сразу увидет что тут проблема!
user posted image
Я скорей всего не туплю тут.

Присоединённый файл ( Кол-во скачиваний: 9 )
Присоединённый файл  Experement.rar 31,62 Kb
PM MAIL   Вверх
AugMaster
Дата 27.4.2007, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 3.8.2006

Репутация: 1
Всего: 1



к сожалению мало времени,не могу глянуть твой экзапмл. Проверь, чтобы Socket.SendText(Outpacked(pack))=длине этого Outpacked(pack) . Если не равно - значит часть данных не высылается из-за перегрузки буфера отправки. Тогда ждешь событие OnSend(или OnWrite, чтоб я так помнил, оно есть в компоненте в Events) и доотправляешь то, что не было отправлено из-за перегрузки.

PM MAIL   Вверх
Ak47black
Дата 27.4.2007, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

Репутация: нет
Всего: 0



Цитата

OnWrite

Хм.. ,шас попробую.

Это сообщение отредактировал(а) Ak47black - 27.4.2007, 12:28
PM MAIL   Вверх
Ak47black
Дата 27.4.2007, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

Репутация: нет
Всего: 0



Ну OnWrite то неработает (точнее событие происходит не после каждой посылке),но тут я тож думаю что проблема изза перегрузки.

Добавлено @ 13:03
Кто-нибудь может сказать что-нибудь по этому поводу?
Если кто непонимает в чем проблемма, в крипленом исходнике всё поймете)

Это сообщение отредактировал(а) Ak47black - 27.4.2007, 13:56
PM MAIL   Вверх
Ak47black
Дата 27.4.2007, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

Репутация: нет
Всего: 0



AugMaster, 
Цитата

Socket.SendText(Outpacked(pack))=длине этого Outpacked(pack)

Помогло. +
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0866 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.