Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

У Клиента в сокете остается инфа? [D5, Win95/98, WinME, NT4, Win2k, WinXP]


Dimich1978 ©   (2003-02-07 15:01:00) 

в программе Сервер отсылает команду клиенту чтобы тот из БД считал данные и переслал их серверу. Все работает на этом уровне нормально, но как только сервер посылает эту команду повторно от клиента приходят сообщения(все что нового появилось в БД)+ сообщения которые он уже переслал, хотя физичеки в БД этих записей уже нет, т.к. они были удалены после того как сервер принял данные в первый раз. Такое ошющение как будто в сокете клиента эти данные храняться и каждый раз вместе с данными(которые текущие) еще и передает данные которые были физически удалены, но остались каким то образом в сокете(клиента).
Как можно с этим бороться и вообще кто нибудь сталкивался с такой проблемой. За все советы заранее всем благодарен.


Digitman   (2003-02-07 17:08:00) [1]


> buf:=socket.receiveText;//Читаю что пришло от сервера


а от сервера, к примеру, пришло "cl" ? или "clea" ?
и только при возникновении очередного OnRead() придет "остаток" - "ear" или "r" ?

что будешь делать в таком случае ?


mrcat   (2003-02-07 16:49:00) [2]

dimich1978 © (07.02.03 16:14)
Может быть просто буфер очистить.....только каким образом?


Если все сделано правильно - буфер очищается после чтения данных.


mrcat   (2003-02-07 16:39:00) [3]

1. что делают SendLongText, ReceiveLongText?
2. Где уверенность, что тут:
buf:=socket.receiveText;//Читаю что пришло от сервера
...
if "clear"=buf then begin

Вы получите в buf именно "clear"?


dimich1978   (2003-02-07 16:14:00) [4]

Прием: Использую юнит, где происходит расклейка пакетов
Procedure tform1.DataProcessing(const S:ansiString);
var ss,ss1:ansistring;
k,i:integer;
begin
k:=0;
ss1:=s;
ss:=copy(s,5,length(s));
//Название компов собираем в combobox
if copy(s,0,4)="comp" then
begin
for i:=0 to combobox1.Items.count-1 do
if ss=combobox1.Items.strings[i] then k:=1;
if k=0 then combobox1.Items.add(ss);
end;

if (s="Go") then flag1:=0;
if s="Stop" then
begin
memo2.lines.add(s);
for i:=0 to 10 do mas[i]:="";
flag1:=1;
flag2:=0;
vseg:=0;
end;
if flag1=0 then
begin
memo2.lines.add(s);
flag2:=flag2+1;
if (flag2>=2)and (flag2<=6) then
begin
vseg:=vseg+1;
mas[vseg]:=s;
memo1.lines.Add(mas[vseg]);
end;
if (flag2=6) then
begin
table1.close;
table1.open;
table1.insert;
table1.Fields[0].asstring:=mas[1];
table1.Fields[1].asstring:=mas[2];
table1.Fields[2].asstring:=mas[3];
table1.Fields[3].asstring:=mas[4];
table1.Fields[4].asstring:=mas[5];
table1.post;
flag2:=0;
vseg:=0;
end;
end;
end;

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
begin
ReceiveLongText(Socket,DataProcessing);
end;

-----------
Передеча:
procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var sm,s,s1:string;
buf:ansistring;
i:integer;
begin
buf:=socket.receiveText;//Читаю что пришло от сервера
s1:=copy(buf,0,5);
sm:=copy(buf,6,length(buf));
if "clear"=buf then begin
for i:=0 to table1.RecordCount-1 do begin
table1.delete;
table1.next;
end;
end;
if ("start"=s1) and (sm=label1.caption) then /Если все сошлось то выполнить
timer3.Enabled:=false;
begin
// теперь отсылаем все серверу из БД используя функцию из доп. юнита, этот юнит можно найти в базе готовых решений. Прислал: Subfire (Санкт-Петербург) ( 2 октября 2002 г. )
table1.first;
for i:=0 to table1.RecordCount-1 do begin
SendLongText(ClientSocket1.Socket,"Go");
SendLongText(ClientSocket1.Socket,table1.fields[0].asstring);
SendLongText(ClientSocket1.Socket,table1.fields[1].asstring);
SendLongText(ClientSocket1.Socket,table1.fields[2].asstring);
SendLongText(ClientSocket1.Socket,table1.fields[3].asstring);
SendLongText(ClientSocket1.Socket,table1.fields[4].asstring);
table1.Next;
end;
SendLongText(ClientSocket1.Socket,"Stop");
timer3.enabled:=true;
end;
end;
ВСЕ ПАКЕТЫ ПОЛУЧАЮТСЯ РАСКЛЕЕНЫМИ, ВСЕ НОРМАЛЬНО, но с данные каким то образом сохраняются в буфере сокета. Может быть просто буфер очистить.....только каким образом?


mrcat   (2003-02-07 15:28:00) [5]

приведите код, где осуществляется передача/прием


Наверх

Титульная страница Поиск, карта сайта Написать письмо