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