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

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.041 c
2-1143705139
Scorpio
2006-03-30 11:52
2006.04.16
MainMenu


15-1143186047
оЛиневод
2006-03-24 10:40
2006.04.16
Как хранится файл на диске


2-1143964000
He3Hauka
2006-04-02 11:46
2006.04.16
Обход дерева


15-1143037767
Харько
2006-03-22 17:29
2006.04.16
Задачка в среду


1-1142427273
DelphiLexx
2006-03-15 15:54
2006.04.16
Отобразить Hint в нужном месте окна





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