Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.04.16;
Скачать: CL | DM;

Вниз

Настлоение строк   Найти похожие ветки 

 
ezorcist   (2005-12-31 13:58) [0]

Вопрос, наверное, частый, но найти ответа в статьях не смог(
Посылаю по сокету строки (команда+параметр) на удаленную машину и когда надо передать так команд 50, то получается что-то вробе наслаивания. Ставлю слип(50), тестирую клиент и сервер на одном ПК = работает, на разных в сети =  "наслоение", ставлю слип(300) на разных компах опять не фурычит( больше времени на слип ставиь нельзя (задача не позволяет). Можно как-то просто от этого уйти ли надо искать другое решение? (вроде дополнительных разделителей в троку и т.д.)?


 
PAVIA ©   (2005-12-31 15:15) [1]

Объясняю в двух словах.
Если ты передаешь через TCP. Другими словами Блокируещей режим.
И есть UDP. Не блокируемый режим.
В первом случае у тебя происходит накопление и затем передаются данные. Во втором случае пакет без задержки передается, как есть. TCP- горонтирует, что пакеты будут даставлены. И порядок их не нарушится. В отличии от UDP который таких гарантий не доет.


 
FrykT ©   (2005-12-31 17:29) [2]

В дополнение к посту PAVIA:
Строка отсылается в виде ( у меня так) :
delimer len_str delimer2 str
#5:FrykT
Вот код раскодировщика:
procedure DecodeStr(AText: string; var lpResult: TStrings);
var
 zPos: integer;
 Size: integer;
 LenStr: Integer;
 GlobLen: integer;
 str: String ;
 s1: string;
begin
 lpResult.Clear;
 Size := 0;
 Str := AText;
 GlobLen:= Length(Str);
 repeat
   if Str[1] = FStrDelimer then
   begin
     zPos:= Pos(FSizeDelimer, Str);
     if zPos = 0 then
     begin
       FTemp := Str;
       Str := EmptyStr;
     end
     else
     begin
       try
         Size:= StrToInt(copy(Str, 2, zPos-2));
       except
         FTemp := EmptyStr;
         exit;
       end;
       LenStr := Length(Str) - (zPos);
       if LenStr < Size then
       begin
         FTemp := Str;
         exit;
       end
       else
       begin
         s1 := Copy(Str, zPos + 1, Size);
         lpResult.Add(s1);
         Delete(Str, 1, zPos + Size);
       end;
     end;
   end
   else
   begin
     if (Length(Str) = GlobLen) then
     begin
       if (FTemp = EmptyStr) and (Str[1] <> FStrDelimer) then
         exit;
     end
     else
     begin
       if (Str[1] <> FStrDelimer) then
         exit;
     end;
     Str := FTemp + Str;
     FTemp := EmptyStr;
   end;
 until Length(Str) = 0;
end;

Где, -
FStrDelimer -  это "#";
FSizeDelimer - это ":";
FTemp - это глобальная переменная типа STRING.

Вот пример закодировщика:
function EncodeStr(AText: string): string;
var
 LenStr: Integer;
begin
 LenStr := Length(AText);
 Result := FStrDelimer + IntToStr(LenStr) + FSizeDelimer + AText;
end;


p.s. Всё сам писал, т.к. в своё время не нашел в инете такой информации.


 
FrykT ©   (2005-12-31 17:38) [3]

Саму строку я еще и через шифрование пропускаю, но думаю тут это лишнее.


 
XProger ©   (2005-12-31 19:24) [4]

В IRC протоколе между строками-командами ставится #13#10 в качестве разделителя :)


 
FrykT ©   (2006-01-03 10:18) [5]

Дополнение к посту <XProger>
простенький парсер IRC, не отрицаю, что криво =))))
procedure ParseIRC(Str: string; var list: TStrings);
var
 s: string;
 hInd: Integer;
begin
 s := EmptyStr;
 hInd := 0;
 while (Str <> EmptyStr) do
 begin
   if (Str[1] in IRCCharSetDelimers[hInd]) then
   begin
     if Str[1] = ":" then
       Inc(hInd, 1);
     if s <> EmptyStr then
     begin
       list.Add(s);
       s := EmptyStr;
     end;
   end
   else
     s := s + Str[1];
   delete(Str, 1, 1);
 end;
 if s <> EmptyStr then
   list.Add(s);
end;



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

Текущий архив: 2006.04.16;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.028 c
2-1144130848
RomanH
2006-04-04 10:07
2006.04.16
2 графика в одном DBChart е


15-1143567802
Нехочуха
2006-03-28 21:43
2006.04.16
Побольше дискуссий, хороший и разных.


2-1143629843
Федя
2006-03-29 14:57
2006.04.16
Ну, неужели никто не знает? Chart, Date, Time


2-1143777257
_kos_
2006-03-31 07:54
2006.04.16
Список юзеров на IdIRC


1-1142420907
V-A-V
2006-03-15 14:08
2006.04.16
Просмотр XML файлов