Главная страница
    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.033 c
2-1143712801
Titanik
2006-03-30 14:00
2006.04.16
Heeelp!


15-1142150327
ARC
2006-03-12 10:58
2006.04.16
Немного Философии о программировании


15-1143307662
Bogdan1024
2006-03-25 20:27
2006.04.16
скачать книги


15-1143199730
Wolfram
2006-03-24 14:28
2006.04.16
Многопоточные приложения


15-1142731950
Лорд Байрон
2006-03-19 04:32
2006.04.16
Проблемы с виндой





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