Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.10.01;
Скачать: CL | DM;

Вниз

Record и String: Жить им вместе?   Найти похожие ветки 

 
kirik   (2006-09-13 10:26) [0]

Как можно данные из TRecord запихнуть потоком в String? То есть например при получении через сокет  пакета данных проверять если есть определённая датаграмма - то в Trecord, иначе - в String?


 
Dmitrij_K   (2006-09-13 10:29) [1]

Имеем буфер
buf : Array[0..255] of Byte;

if String then
begin
 SetLength(str,РАЗМЕР);
 CopyMemory(@str[1],@buf[0],РАЗМЕР);
end
          else
begin
 CopyMemory(@Record,@buf[0],SizeOf(Record));
end;


 
Сергей М. ©   (2006-09-13 10:29) [2]

var
 Record: TRecord;
 Str: String;
..
 SetLength(Str, SizeOf(Record));
 Move(Record, PChar(Str)^, SizeOf(Record));


 
kirik   (2006-09-13 10:35) [3]

простое перемещение в памяти?


 
Сергей М. ©   (2006-09-13 10:38) [4]

простое "запихивание")


 
kirik   (2006-09-13 10:40) [5]

> ests> mys.htm
Datagram received: Сорский ГОК,ОАО
Datagram received: Сорский ГОК,ОАО

вот что получаем после "запихивания". первая строчка это два отдельных сообщения !текстовых! отправленных не как файл, а как простой текст. он не переносит строки..


 
kirik   (2006-09-13 10:46) [6]

> tetetetetet~€УwЁЮ> test> test> test> Edit2
во чё даёт гад:(


 
Dmitrij_K   (2006-09-13 10:50) [7]

ты код показывай а не результат. Телепаты в отпуске


 
kirik   (2006-09-13 10:58) [8]

procedure TForm1.Button5Click(Sender: TObject);
var St: TFileStream; ms: TOrganization;  I: Integer;
begin
 if (ClientSocket1.Active=False) then Exit;
 try
 St := TFileStream.Create("\\192.168.0.1\shared\áàçà\db2\dblist.dat ", fmOpenRead or fmShareDenyNone);
 with ClientSocket1 do begin
    for I := 1 to 1 do begin
      Randomize;
      st.Seek(sizeof(ms)*Random(555), 0);
      st.Read(ms, sizeof(ms));
      socket.SendBuf(ms, sizeof(ms));
    end;
 end;
 St.Destroy;
 except
 end;
end;

   procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
     Socket: TCustomWinSocket);
   var mr: string; rl: integer; oa: torganization;
   begin
     {Îò êëèåíòà ïîëó÷åíî ñîîáùåíèå - âûâîäèì åãî â Memo1}
     rl := socket.ReceiveLength;

     socket.ReceiveBuf(oa, socket.ReceiveLength);
     if (rl=sizeof(oa)) then begin
       Memo1.Lines.Insert(0, "Datagram received: "+trim(oa.Name));
     end else begin
       SetLength(mr, SizeOf(oa)+2);
       Move(oa, PChar(mr)^, SizeOf(oa));
       mr := trim(mr) + #13#10;
       Memo1.Lines.Insert(0,"> "+mr);
     end;
     if (mr=#13#10) then Socket.Close;
   end;


 
Elen ©   (2006-09-13 11:04) [9]


> kirik

А ты не забыл что в String первые 2 байта - длина строки?
Это я по поводу Move(oa, PChar(mr)^, SizeOf(oa));
Ты уж лучше обьяви mr:pchar и не забывай добавлять при переносе #0


 
kirik   (2006-09-13 11:05) [10]

а при выводе сделать StrPas? если можно, код? Не соображаю - ночью не спал.


 
Сергей М. ©   (2006-09-13 11:06) [11]

Ерунда какая-то .. код - фтопку ..

Ты скажи по-русски, тебе что нужно сделать-то - передать файл от клиента серверу или что ?

ПРиведи фрагмент реального содержимого файла dblist.dat ..


 
kirik   (2006-09-13 11:09) [12]

Фрагмент файла:
Элпроммаш, ООО                                                                                      443090  Самара                                                                                                                                                           846   2763000, Блинов Е.В.                                                                                          2734999,2734900                                                                                                   0.edf090.edf        Промышленное оборудование                                                       Самарская область                                                                 Салаватский железобетонный завод, ОАО                                                               www.elprommash.ru                                                               mail@elprommash.ru                                                              

Причина:
Не устраивает скорость передачи данных из этого файла - для удалённых пользователей слишком долго

Попытки действия
1. Кеширование в архив на локал. Отвергнуто, т.к. изменения не фиксировались вовремя.

2. В данный момент попытка транзакций через сокеты, дабы передавать данные пакетами по SizeOF(TOrganization)[955 байт], а не весь файл каждый раз. При попытке быстро передать несколько записей-Async error.

Вот...


 
Сергей М. ©   (2006-09-13 11:14) [13]


> kirik   (13.09.06 11:09) [12]


Т.е. файл - текстовый ?


> При попытке быстро передать несколько записей-Async error


Абсолютно нормальное явление.


 
kirik   (2006-09-13 11:15) [14]

То есть файл - file of TOrganization [655x955bytes]


 
kirik   (2006-09-13 11:18) [15]

>> При попытке быстро передать несколько записей-Async error
Хм. А как бороться? Группировать по N записей и слать скопом?


 
Сергей М. ©   (2006-09-13 11:24) [16]


> То есть файл - file of TOrganization [655x955bytes]
>


Приведи объявление структуры TOrganization


> как бороться?


Либо на клиенте использовать режим ctBlocking, либо грамотно обрабатывать событие OnWrite, либо использовать SendStream

С сервером - отдельная песня. Он у тебя заведомо неправильно организован на приеме.


 
kirik   (2006-09-13 11:30) [17]

А это не моя организация, стянул с delphi.mastak.ru, пожалуйста, помогите, как правильно организовать? сроки поджимают...


 TOrganization=record

   Name           : String[100];

   AdressIndex    : String[8];
   AdressCity     : String[50];
   AdressStreet   : String[100];
   AdressDom      : String[4];
   AdressOffice   : String[4];
   OfficePhoneC   : String[6];
   OfficePhoneN   : String[8];

   RukovodName    : String[80];
   RukovodPhoneC  : String[6];
   RukovodPhoneN  : String[8];
   RukovodPhoneE  : String[4];
   ExtPhones      : String[110];

   Vajnost        : (vlLow, vlMedium, vlHigh, vlNone);
   VajnostFlag    : (vfRed, vfGreen, vfBlue, vfNone);
   Prozvon        : (psProzvoneno, psNeprozvoneno, psPM);
   Vozrast        : (tsOld, tsNew);
   Obrabotka      : (osObrabotano, osNeobrabotano);
   Prodagi        : (pcLow, pcMedium, pcHigh, pcNone);
   SpecFlag       : (sfRed, sfGreen, sfBlue, sfNone);

   ExtInfoFile    : String[20];    // ext-info filename
   Category       : String[80];
   Region         : String[80];
   IsInHolding    : Boolean;
   HoldingName    : String[100];

   WWW            : String[80];
   Email          : String[80];
 end;


 
kirik   (2006-09-13 11:40) [18]

> Либо на клиенте использовать режим ctBlocking
точно такая же ошибка, да ещё и текст принимать перестал

> грамотно обрабатывать событие OnWrite
брат, я чайник в сокетах!

> либо использовать SendStream
а как потом из него строчку вытаскивать, через StringStream?


 
Dmitrij_K   (2006-09-13 11:56) [19]

На принимающей стороне заведи глобальный буфер, в него читай из сокета данные, пока его размер не станет >= твоей структуре. Потом из буфера скопируй данные в свой рекорд и удали скопированные данные из временного буфера.


 
Сергей М. ©   (2006-09-13 12:12) [20]

Клиент:

var
 rec: TOrganization;
 ms: TStream;
..
 ms := TMemoryStream.Create;
 try
   ms.WriteBuffer(rec, SizeOf(rec));
   ms.Position := 0;
   ClientSocket.Socket.SendStream(ms);
 except
  ms.Free;
  raise;
 end;

Сервер:

type
 PRecvData = ^TRecvData;
 TRecvData = packed record
   BytesRead: Integer;
   org: TOrganization;
 end;

событие OnConnect:

Socket.Data := AllocMem(SizeOf(TRecvData));

событие OnDisConnect:

SysFreeMem(Socket.Data);

событие OnRead:

var
 pBuf: ^TOrganization;
 cBytesToRead: Integer;
 cBytesRead: Integer;
..

 pBuf := PRecvData(Socket.Data).org;
 cBytesRead := PRecvData(Socket.Data).BytesRead;
 Inc(PByte(pBuf), cBytesRead);
 cBytesToRead := SizeOf(pBuf^) - cBytesRead;
 cBytesRead := Socket.ReceiveBuf(pBuf^, cBytesToRead);
 if cBytesRead = 0 then Exit;
 Dec(cBytesToRead, cBytesRead);
 cBytesRead := (SizeOf(pBuf^) - cBytesToRead) mod SizeOf(pBuf^));
 PRecvData(Socket.Data).BytesRead := cBytesRead;
 if cBytesRead = 0 then ShowMessage("Принята очерадная структура TOrganization"); //данные которой доступны в ЭТОТ момент в PRecvData(Socket.Data).org


 
kirik   (2006-09-13 12:35) [21]

побайтовое чтение?


 
Сергей М. ©   (2006-09-13 12:37) [22]


> побайтовое чтение?


Какое такое "побайтовое" ?!

Где ты его увидел ?


 
kirik   (2006-09-13 12:52) [23]

ой. звиняюсь. не туда посмотрел:)

может я конечно глупость спрошу... но всё же:

требуется реализация такая:

1. ф-ция SendData(Pos: Integer; Data: TOrganization): Boolean;
возвращает да если была запись нет если не получилось
2. ф-ция RecvData(Pos: Integer): TOrganization;
возвращает прочитанную с запроса на сервере позицию

+ ещё желательно универсальную функцию для чтения любых файлов по указанному количеству байт вроде:

procedure ReadFrom(var Buffer; DataSize, Pos: word);
function WriteTo(const Buffer; DataSize, Pos: word);

у меня они реализованы под файловую систему, а как их запустить в алгоритм чтения из сокетов? в принципе соединение клиента устанавливается при входе, и разрывается только при закрытии программы СУБД..

Как бы это...ну в смысле воспроизвести? Бьюсь неделю - не пойму... Там данные передаются довольно интенсивно (3-4 запроса в секунду), и надо ещё это учесть...ох, голова болит уже...

Тыкните меня носом в ту кучу, где нужно копать...


 
Elen ©   (2006-09-13 12:55) [24]


>  ещё желательно универсальную функцию для чтения любых файлов
> по указанному количеству байт

BlockRead, BlockWrite


 
Elen ©   (2006-09-13 13:01) [25]


> kirik

кстати что твои пользователи настолько удалены что обычное чтение тормозит? или они не в локалке?


 
kirik   (2006-09-13 13:09) [26]

вторая часть офиса работает через VPN, а у нас канал узковат...

BR, BW я это знаю, только это у меня реализовано для файловой системы а не для сети! Тут дело в том что я не пойму как распознать качество полученных данных...


 
Elen ©   (2006-09-13 13:13) [27]


> kirik

А базами данных работать не хош?


 
kirik   (2006-09-13 13:18) [28]

плин... не умею я:( ...да и нет необходимости из-за 600 записей учиться...


 
Сергей М. ©   (2006-09-13 13:22) [29]


> kirik   (13.09.06 12:52) [23]


Принципиально ли использование именно TServer/ClientSocket ?


 
kirik   (2006-09-13 13:25) [30]

Принципиально упорность в быстродействии - как минимум 5 мб/сек. Есть другие предложения? Indy?


 
Сергей М. ©   (2006-09-13 13:27) [31]


> kirik   (13.09.06 13:25) [30]


При твоей подготовке - да, Indy.


 
Сергей М. ©   (2006-09-13 13:29) [32]

Или ICS.

Или, в кр.случае, TTCPServer/Client.

TServer/ClientSocket для тебя в дан.случае (даже в блок.режиме) вряд ли подойдет.


 
Elen ©   (2006-09-13 13:30) [33]


> kirik

Не хочеш учиться А здря... БД на пустом месте не создавались. И твою проблему решилибы на раз-два


 
kirik   (2006-09-13 13:34) [34]

Сергей М. C Indy пытался разобраться но никак не могу понять. Технологию пытался сделать так:

192.168.1.175 > CONNECT 192.168.1.10
+CONNECT OK
192.168.1.175 > GET dblist.dat [номер записи] [размер данных]
+REQUEST ACCEPTED
sdlkgfsdkjfghkjdflhgjksdfhgjklserdgkndfgjldksfgberltgjebsdrfg <-- данные
+OK
+CONNECTION CLOSED

192.168.1.175 > CONNECT 192.168.1.10
+CONNECT OK
192.168.1.175 > POST dblist.dat [номер записи] [размер данных]
+REQUEST ACCEPTED
dfhgjkdfhgjkhdskjghlsfdhgksdhfgjklshdfgjkhdsfghsdfjkgjdffgf <-- данные
+OK
+CONNECTION CLOSED

Что нужно для реализации?


 
kirik   (2006-09-13 13:35) [35]

Elen некогда тут учиться, 3 дня до сдачи проекта


 
Сергей М. ©   (2006-09-13 13:39) [36]


> kirik   (13.09.06 13:34) [34]
>  Технологию пытался сделать так:


Это хрень какая-то, а не "технология")


> некогда тут учиться, 3 дня до сдачи проекта


Прими мои соболезнования по поводу твоего скоропостижного увольнения.

Сети - это не два пальца об асфальт)


 
kirik   (2006-09-13 13:41) [37]

Сергей М.
Я думал, что здесь издеваться не будут. Оказалось, ошибся...


 
Elen ©   (2006-09-13 13:44) [38]


> kirik

Это ты сам над собой издеваешся решая такие задачи таким способом, еще и не зная как этот способ применять. Заранее думай впредь. А пока так и оставь с тормозом до следующего апгрейда.


 
Сергей М. ©   (2006-09-13 13:45) [39]


> kirik   (13.09.06 13:41) [37]


Здесь и не издеваются.

Здесь тебе намекают, что приведенное тобой в [34] - черт-те откуда взятая галиматья.

Здесь тебе намекают, что ежели ты "пытал" Инди, то в твоих же интересах привести код, а не ту самую лог-галиматью


 
kirik   (2006-09-13 13:46) [40]

Хотел реализовать наподобие POP3 сервера...



Страницы: 1 2 вся ветка

Текущий архив: 2006.10.01;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.046 c
2-1158069474
Леонид Федьков
2006-09-12 17:57
2006.10.01
Tmemo - изменение цвета для отдельных строк


2-1158216257
ГореПрограммер
2006-09-14 10:44
2006.10.01
Пересчет координат


3-1153389366
NGPOL
2006-07-20 13:56
2006.10.01
Удаления в дочерней таблице


15-1157895357
wwwrr
2006-09-10 17:35
2006.10.01
Кто перевидёт...???


15-1157662081
Offtoper
2006-09-08 00:48
2006.10.01
Просто оффтоп