Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.10.01;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.56 MB
Время: 0.018 c
1-1155917134
Kubivan
2006-08-18 20:05
2006.10.01
Вопрос по реестру


1-1155790814
DelphiLexx
2006-08-17 09:00
2006.10.01
Краткость инициализации записи


2-1158136961
Gem
2006-09-13 12:42
2006.10.01
Ошибка: Недопустимый флаг преобразования


1-1156176876
zip0
2006-08-21 20:14
2006.10.01
Как узнать handle окна explorer a?


4-1148486061
Raptoridzevv
2006-05-24 19:54
2006.10.01
хндл => path





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