![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TIdUDPserver
DesWind © (2006-08-17 14:30:00)Есть UDP-клиент, который отправляет данные таким образом
procedure SomeEvent(Sender: TObject);
var
str: string
begin
....
udpClient.Send(str);
end;
Настроен на конкретный IP.
Есть UDP сервер, настроенный(может не правильно) принимать пакеты с любого IP.
procedure TSomeThread.Execute;
var
Str: string;
begin
Str:=dtmRecive.udpRecive.ReceiveString();
CritSec.Acquire;
try
DataStrs:=DataStrs+Str;
finally
CritSec.Release;
end;
end;
Так вот строки приходят через одну, т.е если посылать то "А" то "В" - приходят только "В". Что я делаю не так?
Slym (2006-08-17 15:39:00) [21]Slym © (17.08.06 15:36) [13]
а теперь так:
program Project2;
{$APPTYPE CONSOLE}
uses
SysUtils,Classes,SyncObjs;
type
TTestThread=class(TThread)
protected
procedure Execute; override;
end;
var s:string;
var cs:TCriticalSection;
var t:TTestThread;
procedure TTestThread.Execute;
var i:integer;
begin
FreeOnTerminate:=true;
repeat
cs.Enter;
try
i:=StrToInt(s);
sleep(0);
if i<>StrToInt(s) then raise exception.Create('Alarm');
s:=IntToStr(i+1);
writeln(s);
finally
cs.Leave;
end;
until not(i<maxint);
end;
begin
s:='0';
cs:=TCriticalSection.Create;
try
TTestThread.Create(false);
t:=TTestThread.Create(false);
t.WaitFor;
finally
cs.Free;
end;
end.
DesWind (2006-08-17 15:37:00) [22]
> ошибка гдето в остальном коде...
Остального кода нет :), разве что по таймеру в мемо выводится DataStrs. Если перевести TidUDPServer на события (т.е. выбирать данные по событию IdUDPServer1UDPRead), то все приходит нормально как и должно, но меня события не устраивают.
Slym (2006-08-17 15:36:00) [23]Ketmar © (17.08.06 15:24) [10]
что это не совсем правда
попробуй:
program Project2;
{$APPTYPE CONSOLE}
uses
SysUtils,Classes;
type
TTestThread=class(TThread)
protected
procedure Execute; override;
end;
var s:string;
var t:TTestThread;
procedure TTestThread.Execute;
var i:integer;
begin
FreeOnTerminate:=true;
repeat
i:=StrToInt(s);
sleep(0);
if i<>StrToInt(s) then raise exception.Create('Alarm');
s:=IntToStr(i+1);
writeln(s);
until not(i<maxint);
end;
begin
s:='0';
TTestThread.Create(false);
t:=TTestThread.Create(false);
t.WaitFor;
end.
Ketmar (2006-08-17 15:27:00) [24]> [11] Slym © (17.08.06 15:26)
я имел в виду "такого, как для TCP, где накапливаются пакеты". накопления не происходит, новоприбывший пакет замещает старый.
Slym (2006-08-17 15:26:00) [25]Ketmar © (17.08.06 14:54) [3]
для udp нет буфера
откуда это? по дефолту буфер есть у всех... в т.ч. и у RAW соков только буфер то маленький... и все что в него не влазит - игнорится (UDP)
Ketmar (2006-08-17 15:24:00) [26]> [7] Slym © (17.08.06 15:22)
> строка это сложный поточно незащищенный ресурс
точно? я полез читать исходник. потому как мне память подсказывает, что это не совсем правда.
Slym (2006-08-17 15:23:00) [27]DesWind © (17.08.06 15:18) [6]
Если нарушен порядок символов так это от того что порядок пакетов UDP не гарантирует
Ketmar (2006-08-17 15:23:00) [28]так может пакеты вообще теряются нафиг в дороге. "была зима, на небе были тучи..." (ц)
по твоему коду нифига не ясно.
Slym (2006-08-17 15:22:00) [29]Ketmar © (17.08.06 14:37) [1]
а зачем критическая секция? для строк не надо
Надо... строка это сложный поточно незащищенный ресурс
DesWind © (17.08.06 15:01) [5]
Выбирать я их точно успеваю
ошибка гдето в остальном коде...
DesWind (2006-08-17 15:18:00) [30]А вообще получаются очень интересные строчики на выходе типа такого "ABBBBBBBABBBBBBABBBBBBABBBBBBABBBBBBABBBBBBABBBBBBABBBBBBA", или еще какойнить рисунок.... Ниче не понимаю!!!!
DesWind (2006-08-17 15:01:00) [31]Вообще-то оправляется по одному символу где-то раз в 10 сек. Выбирать я их точно успеваю.
Slym (2006-08-17 14:57:00) [32]DesWind © (17.08.06 14:30)
если посылать то "А" то "В" - приходят только "В".
Файрвол на букву "А" :)
Ketmar (2006-08-17 14:54:00) [33]а вообще -- для udp нет буфера. если ты не успел забрать пакет до прихода нового -- то уже и не заберёшь никогда. есть подозрение, что пакеты приходят шутсро, а забираются медленно. потому и теряются -- старый пакет перезаписывается новым до выборки.
DesWind (2006-08-17 14:45:00) [34]Ниче здоровее будет.
Ketmar (2006-08-17 14:37:00) [35]а зачем критическая секция? для строк не надо. %-)