Форум: "Сети";
Текущий архив: 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